Привет, я создаю программу, которая использует обработчик сигнала, показанный ниже ...
struct sigaction pipeIn;
pipeIn.sa_handler = updateServer;
sigemptyset(&pipeIn.sa_mask);
pipeIn.sa_flags = SA_ONESHOT;
if(sigaction(SIGUSR1, &pipeIn, NULL) == -1){
printf("We have a problem, sigaction is not working.\n");
perror("\n");
exit(1);
}
Проблема в том, что этот обработчик срабатывает, когда он не должен.Единственное, что должно посылать сигнал SIGUSR1 - это мой дочерний процесс, который существует внутри бесконечного цикла while, который прослушивает входящие соединения.Дочерний процесс разветвлен, как вы можете видеть ниже.Я переделываю обработчик pipeIn, чтобы запустить другую функцию, которую использует дочерний процесс, а родительский - нет.Код показан ниже.
while(1){
newSock = accept(listenSock,(struct sockaddr *)&their_addr,&addr_size);
printf("A\n");
if(!fork()){
// We want to redefine the interrupt
pid_t th;
th = getpid();
printf("child pid: %d\n",th);
pipeIn.sa_handler = setFlag;
if(sigaction(SIGUSR1, &pipeIn, NULL) == -1){
printf("We have a problem, sigaction is not working.\n");
perror("\n");
exit(1);
}
close(listenSock);
kill(getppid(),SIGUSR1);
waitForP();
}*/
close(newSock);
exit(0);
}
close(newSock);
//waitForP();
//break;
}
Когда я запускаю этот код, я позвоню с другого компьютера, чтобы подключиться к моей серверной программе, которую вы видите здесь.Он будет просто accept()
один запрос от этого компьютера, но потом дочерний процесс в конечном итоге сможет отправить SIGUSR1 в родительский процесс.Однако родительский процесс получает сигнал SIGUSR1 еще до того, как дочерний процесс получает сигнал.Обработчик отключает функцию раньше, чем она должна ... затем дочерний процесс, наконец, получает, чтобы убить сигнал, и обработчик выключается во второй раз.Наконец, функция accept()
снова отключается, даже если новые соединения не создаются, а входящий IP-адрес взят со странного случайного IPv6-адреса.Я не знаю, что происходит.Любая помощь будет великолепна.