我正在尝试通过使用信号(在本例中为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 );
}
答案 0 :(得分:8)
如果使用signal
建立信号处理程序,则accept
会自动重新启动。使用signal
类似于使用sigaction
并sa_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 );