您好,我正在构建一个使用如下所示的信号处理程序的程序...
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 循环中,用于监听传入连接。子进程被 fork ,如下所示。我重做 pipelineIn 处理程序以运行子进程使用的不同函数,而父进程则不使用该函数。代码如下所示。
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 信号。处理程序在函数应该之前触发函数...然后子进程最终杀死信号并且处理程序第二次关闭。最后,即使没有产生新的连接并且传入的 IP 地址来自随机的奇怪 ipv6 地址,accept()
函数也会再次关闭。我不知道发生了什么事。任何帮助都会很棒。
最佳答案
跟我重复一遍:始终检查从 system call 返回的错误(accept(2)
是 - 您将得到 -1
而不是套接字描述符、errno
中的 EINTR
和未定义的连接地址)。
关于c - Accept() 和 SIGUSR1 被意外触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347259/