Отправка сигнала в stream из аннуитетного стека процессов и протоколирования не происходит

Я пытаюсь передать сигнал в stream POSIX из другого процесса (не из процесса, который создал этот stream. Что я сделал для отправки сигнала с помощью kill (…) ::

int trap_handle(pid_t child_waited ) 69 { 70 printf("%s, new value: %d, child_waited=\n", __func__,g_var_x, child_waited); 71 int errno_ = -1; 72 errno_ = kill(child_waited, SIGUSR1); 73 //syscall(SYS_tgkill, -1, child_waited, SIGUSR1); 74 //errno_ = pthread_kill(child_waited, SIGUSR1); 75 if(0==errno_) 76 printf("Signal sent to thread: %ld\n", child_waited); 77 else 78 printf("pthread_kill failed: error:%d", errno_); 79 } 

И в streamе, который зарегистрировал SIGUSR1:

 230 void baz() { 231 g_var_x++; 232 } 233 234 void bak() { baz(); } 235 void bar() { bak(); } 236 void foo() { bar(); } 237 238 void stack_dump() 239 { 240 printf("******trap() entry ******\n"); 241 void *array[100]; 242 size_t size; 243 // get void*'s for all entries on the stack 244 size = backtrace(array, 100); 245 246 // print out all the frames to stderr 247 // fprintf(stderr, "Error: signal %d:\n", sig); 248 backtrace_symbols_fd(array, size, STDERR_FILENO); 249 printf("*******trap() exit ******\n"); 250 } 251 252 void* thread_proc_one(void *lParam) 253 { 254 printf("--Entry: thread_one debugee tid \n", syscall(SYS_gettid)); 255 g_arg_params.debugee_tid = syscall(SYS_gettid); 256 257 struct sigaction trap_action; 258 //printf("Childprocess  %d\n", syscall (SYS_gettid)); 259 memset(&trap_action, 0, sizeof(trap_action)); 260 sigaction(SIGUSR1, NULL, &trap_action); 261 trap_action.sa_sigaction = stack_dump; 262 trap_action.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER; 263 sigaction(SIGUSR1, &trap_action, NULL); .... 

Теперь ожидается, что он будет возвращать стек Thraed не основным процессом, который его вызывал. Но этого не происходит. вызывается stack_dump, но вместо того, чтобы регистрировать стек стека, он регистрирует стек своих родителей. Backtrace показывает стек процесса, который создал stream thread_proc_one.

Кто-нибудь здесь столкнулся с этой проблемой? Надеюсь, я поняла.

sigaction() устанавливает обработчик сигнала для всего процесса.

От man sigaction ( курсив мой):

Системный вызов sigaction () используется для изменения действия, предпринимаемого процессом при получении определенного сигнала.

Какой из streamов процесса обрабатывается, он остается в ОС.

Из man 7 signal :

Распознавание сигнала является атрибутом для каждого процесса: в многопоточном приложении расположение конкретного сигнала одинаково для всех streamов.

Чтобы убедиться, что определенный сигнал обрабатывается определенным streamом, используйте pthread_sigmask() чтобы замаскировать сигнал для всех streamов, кроме одного, чтобы обрабатывать его.

Опять от man 7 signal :

Каждый stream в процессе имеет независимую сигнальную маску, которая указывает набор сигналов, которые в настоящий момент блокирует stream. Поток может манипулировать своей сигнальной маской с помощью pthread_sigmask (3) .

Так, например, это может быть сделано вызовом pthread_sigmask() в основном streamе, маскирующим соответствующий сигнал, до создания любого streamа, а затем внутри streamа для обработки сигнала вызова pthread_sigmask() снова, чтобы разоблачить сигнал, который должен быть обрабатываются.