中断正在等待的accept(),只是更改全局变量值

时间:2015-05-14 09:13:07

标签: c sockets pthreads signals

我正在为大学做一个项目,一个与服务器和多个客户的聊天系统。

在规范文档中写道:

  

主线程在全局变量上执行受控循环,并在每个循环等待用户的连接请求

还有:

  

服务器使用SIGTERM或SIGINT停止。收到信号后,全局变量go设置为零,所有线程退出循环周期

因此,thread main创建套接字,绑定端口,并在每个新连接上执行accept()并创建thread worker,负责与客户端的通信。

我的问题是退出thread main只更改全局变量。 如果我这样做thread main

while (go && accept(params)) {}

它不会进入while循环。

目前代码是

while (go) {
    accept(params);
    // Do stuff
}

而且,当我将go设置为零时,它等待accept,所以我必须创建一个新连接,它接受连接,然后退出线程'原因{ {1}}变为零。

go

相同的问题
thread worker

等待套接字中的char退出循环。

我没有看到只使用while (go && read(socket_id, buffer, sizeof(char)) > 0) {} var退出循环的方法。 我想我要关闭套接字,或者找另一种方式,我错了吗?

我对退出线程的其他方式不感兴趣,只是为了知道是否可以退出循环只需更改go var

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您为SIGINTSIGTERM设置信号处理程序以将go切换为!=0,您还要取消设置处理程序的SA_RESTART标记(s),这将使accept()在信号的接收上返回-1

为此,请使用sigaction()设置信号处理程序。对于您传入的struct sigaction,请勿将成员sa_flags设置为SA_RESTART

有关SA_RESTART标志影响哪个系统调用的详细说明,请参阅{ 信号处理程序的中断系统调用和库函数 “{ {3}}

独立于此,请确保go已定义sig_atomic_t