我怎样才能使用SIGINT来摆脱wait()或read()的等待?

时间:2013-03-08 20:03:35

标签: c sockets sigint

我正在尝试通过使用信号(在本例中为SIGINT)来摆脱wait()和/或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是用于外部循环的这段代码。

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

谢谢。

编辑:

这是对信号的检查,它回到了主要的顶部。我想这就是你要求的:

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

1 个答案:

答案 0 :(得分:8)

如果使用signal建立信号处理程序,则accept会自动重新启动。使用signal类似于使用sigactionsa_flags设置为包含SA_RESTART。使用signal而不是sigaction,并确保struct sigaction的sa_flags字段没有设置SA_RESTART位。

换句话说,而不是:signal( SIGINT, signalhandler ),请使用:

struct sigaction a;
a.sa_handler = signalhandler;
a.sa_flags = 0;
sigemptyset( &a.sa_mask );
sigaction( SIGINT, &a, NULL );