我正在为大学做一个项目,一个与服务器和多个客户的聊天系统。
在规范文档中写道:
主线程在全局变量上执行受控循环,并在每个循环等待用户的连接请求
还有:
服务器使用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
谢谢!
答案 0 :(得分:2)
假设您为SIGINT
和SIGTERM
设置信号处理程序以将go
切换为!=0
,您还要取消设置处理程序的SA_RESTART
标记(s),这将使accept()
在信号的接收上返回-1
。
为此,请使用sigaction()
设置信号处理程序。对于您传入的struct sigaction
,请勿将成员sa_flags
设置为SA_RESTART
。
有关SA_RESTART
标志影响哪个系统调用的详细说明,请参阅{ 信号处理程序的中断系统调用和库函数 “{ {3}}
独立于此,请确保go
已定义sig_atomic_t
。