Accept()和SIGUSR1被意外触发

时间:2012-02-19 06:29:25

标签: c sockets ipc

您好我正在构建一个使用下面显示的信号处理程序的程序......

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地址。我不知道发生了什么事。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

这看起来似乎很明显,但您是否编写了完整警告的代码,并确保您没有?神秘的行为通常是由C编译器只提到的错误引起的......

答案 1 :(得分:1)

在我之后重复:始终检查从system call返回的错误(accept(2)是 - 你得到-1而不是套接字描述符,EINTR在{{ 3}}和未定义的连接地址)。