您好我正在构建一个使用下面显示的信号处理程序的程序......
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地址。我不知道发生了什么事。任何帮助都会很棒。
答案 0 :(得分:1)
这看起来似乎很明显,但您是否编写了完整警告的代码,并确保您没有?神秘的行为通常是由C编译器只提到的错误引起的......
答案 1 :(得分:1)
在我之后重复:始终检查从system call返回的错误(accept(2)
是 - 你得到-1
而不是套接字描述符,EINTR
在{{ 3}}和未定义的连接地址)。