После вызова fork у меня есть один отец, который должен отправить sigusr1 или sigusr2 (в зависимости от значения переменной cod) своему ребенку. Ребенок должен установить правильные обработчики перед получением sigusr1 или sigusr2. Для этого я приостанавливаю отца, ожидая, пока ребенок скажет ему, что он сделал с установкой обработчика. Отцу сообщается sigusr1, и обработчик для этого сигнала устанавливается перед вызовом fork. Однако, кажется, отец не может вернуться с паузы, заставляя меня думать, что он на самом деле никогда не вызывает обработчик sigusr1.Проблемы с обработкой сигналов
[...]
typedef enum{FALSE, TRUE} boolean;
boolean sigusr1setted = FALSE;
boolean sigusr2setted = FALSE;
void
sigusr1_handler0(int signo){
return;
}
void
sigusr1_handler(int signo){
sigusr1setted = TRUE;
}
void
sigusr2_handler(int signo){
sigusr2setted = TRUE;
}
int main(int argc, char *argv[]){
[...]
if(signal(SIGUSR1, sigusr1_handler0) == SIG_ERR){
perror("signal 0 error");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == 0){
if(signal(SIGUSR1, sigusr1_handler) == SIG_ERR){
perror("signal 1 error");
exit(EXIT_FAILURE);
}
if(signal(SIGUSR2, sigusr2_handler) == SIG_ERR){
perror("signal 2 error");
exit(EXIT_FAILURE);
}
kill(SIGUSR1, getppid()); // wake up parent by signaling him with sigusr1
// Wait for the parent to send the signals...
pause();
if(sigusr1setted){
if(execl("Prog1", "Prog1", (char*)0) < 0){
perror("exec P1 error");
exit(EXIT_FAILURE);
}
}
if(sigusr2setted){
if(execl("Prog2", "Prog2", (char*)0) < 0){
perror("exec P2 error");
exit(EXIT_FAILURE);
}
}
// Should'nt reach this point : something went wrong...
exit(EXIT_FAILURE);
}else if (pid > 0){
// The father must wake only after the child has done with the handlers installation
pause();
// Never reaches this point ...
if (cod == 1)
kill(SIGUSR1, pid);
else
kill(SIGUSR2, pid);
// Wait for the child to complete..
if(wait(NULL) == -1){
perror("wait 2 error");
exit(EXIT_FAILURE);
}
[...]
}else{
perror("fork 2 error");
exit(EXIT_FAILURE);
}
[...]
exit(EXIT_SUCCESS);
}
Я подозреваю, что вы подготовили условия гонки в противоположном направлении к тому, что вы ожидали. Ребенок отправил SIGUSR1 родительскому элементу * до того, как родитель достиг «паузы». –
Поместите еще несколько printf() s (и убедитесь, что вы сбросили флажок), чтобы вы могли видеть, как далеко добрался ребенок, и если был вызван обработчик сигнала родителя. Это скажет вам больше. –
@OliCharlesworth: Не видел это .. спасибо. – user996922