gpt4 book ai didi

c - 我如何使用 SIGINT 来打破对 accept() 或 read() 的等待?

转载 作者:太空狗 更新时间:2023-10-29 15:20:06 26 4
gpt4 key购买 nike

我目前正在尝试通过使用信号(在本例中为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com