我目前正在尝试通过使用信号(在本例中为 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 );
}
最佳答案
如果您使用signal
建立信号处理程序,则accept
会自动重新启动。使用 signal
类似于使用 sigaction
并将 sa_flags
设置为包括 SA_RESTART
。使用 sigaction
代替 signal
并确保 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 );
关于c - 我如何使用 SIGINT 来打破对 accept() 或 read() 的等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15302348/