4

我目前正在尝试通过使用信号(在本例中为 SIGINT)来打破对 accept() 和/或 write() 的等待。我的程序也没有按预期离开。

void sigHandler(int signal ){

    printf(" Exit\n");

    //x is global
    x = 1;

    return;

}

我挂断的主要内容主要是:

 clientfd = accept( sockfd, (struct sockaddr *) &client_addr, (unsigned int *) &client_addr_len );

当我点击它并使用我的信号并返回时,我仍然停留在这行代码上,等待用户连接到我的套接字。处理程序中的 x 用于这段代码所在的外部循环。

有没有更好的方法来做我想做的事情?另外,如果这还不够信息,请告诉我。

谢谢你。

编辑:

这是对信号的检查,它位于 main 的顶部。我想这就是你所要求的:

if ( signal( SIGINT, signalhandler ) == SIG_ERR ){
    return( 1 );
}
4

1 回答 1

9

如果您使用 建立信号处理程序signal,则会accept自动重新启动。使用signal类似于使用sigactionwith sa_flagsset to include SA_RESTART。代替signal,使用sigaction并确保sa_flagsstruct sigaction 的字段没有SA_RESTART设置位。

换句话说,代替: signal( SIGINT, signalhandler ),使用:

struct sigaction a;
a.sa_handler = signalhandler;
a.sa_flags = 0;
sigemptyset( &a.sa_mask );
sigaction( SIGINT, &a, NULL );
于 2013-03-08T20:29:35.323 回答