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

标签 c sockets sigint

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

相关文章:

linux - 在 bash 中捕获键盘中断

python - 如何在处理 ctrl-C 事件时访问局部变量?

c - C中的快速排序字符串数组

c - 如何终止 fork 另一个进程的 MPI 程序

java简单服务器客户端程序

C++、Linux、套接字发送性能

c - 编译此程序时出现此构建错误意味着什么?

c - Libssh - SSH MESSAGE 未实现

c++ - C/C++ 套接字和非阻塞 recv()

C++ 不同线程在 FreeBSD 10 上具有相同的线程 ID