не могу получить сигнал GETCHLD во второй раз c linux eclipse

у меня есть программа, которая посылает сигнал SIGCHLD всем другим процессам в системе ДВАЖДЫ. проблема в том, что его отправили только один раз.

программа, отправляющая сигнал:

 int main(){
 kill(-1, SIGCHLD);   
 sleep(8);
 kill(-1, SIGCHLD);
 return 0;}

программа, получающая сигналы:

int main(){
struct sigaction sigchldHandler;
sigchldHandler.sa_flags = 0;
sigset_t BlockMask;
sigfillset(&BlockMask);
sigchldHandler.sa_mask = BlockMask;
sigchldHandler.sa_handler = sigchldFunction;
if( sigaction( SIGCHLD, &sigchldHandler, NULL ) != 0 ){
      perror( "sigaction() error\n" );}
    while(1){
       pause()}
return 0;
}

функция:

void sigchldFunction(int signal){
write(1, "gets here only once\n", strlen("gets here only once\n"));
startHandling();
}

почему он не получает второй сигнал, а только первый? ...ПОМОЩЬ??


person Zohar Argov    schedule 08.06.2016    source источник
comment
Сначала я предлагаю вам научиться правильно форматировать код. Читабельность кода — половина его успеха.   -  person Eugene Sh.    schedule 09.06.2016
comment
как можно короче и понятнее..   -  person Zohar Argov    schedule 09.06.2016
comment
short != clear. Не экономьте на пробелах и новых строках. Разве вы не видели здесь другие вопросы с кодом?   -  person Eugene Sh.    schedule 09.06.2016
comment
ты прав .. чистое время плохо попробую. в любом случае, вы видите что-нибудь здесь?   -  person Zohar Argov    schedule 09.06.2016
comment
Вы не показываете нам код для startHandling(), поэтому мы не можем быть уверены, но вы предположительно находитесь внутри startHandling() с SIGCHLD, заблокированным от вашего обработчика сигнала, потому что вы не указали SA_NODEFER. Таким образом, второй сигнал эффективно игнорируется до тех пор, пока вы не покинете обработчик сигнала.   -  person pilcrow    schedule 09.06.2016
comment
так что если я добавлю блоки, это должно работать? как я редактировал?   -  person Zohar Argov    schedule 09.06.2016
comment
С обработчиками сигнала вы делаете как можно меньше в обработчике сигнала перед возвратом — вызываете как можно меньше функций, выполняете как можно меньше работы, возвращаетесь как можно быстрее. Ваш процесс вообще не получит никаких сигналов, пока не вернется из sigchldFunction(). Вот что означает блокировка всех сигналов.   -  person Jonathan Leffler    schedule 09.06.2016