Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中断正在等待的accept(),只是更改一个全局变量值_C_Sockets_Pthreads_Signals - Fatal编程技术网

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

中断正在等待的accept(),只是更改一个全局变量值,c,sockets,pthreads,signals,C,Sockets,Pthreads,Signals,我正在为大学做一个项目,一个有服务器和多个客户端的聊天系统 规范文件中写有: 主线程在全局var go上执行一个受控循环,并在每个循环中等待用户的连接请求 而且: 服务器使用SIGTERM或SIGINT停止。当接收到信号时,全局var go设置为零,所有线程退出循环 因此,threadmain创建套接字,绑定端口,在每个新连接上执行一个accept()并创建一个thread worker,负责与客户端的通信 我的问题是退出线程main只更改全局变量。 在线程主线程中如果我这样做 while (g

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

规范文件中写有:

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

而且:

服务器使用SIGTERM或SIGINT停止。当接收到信号时,全局var go设置为零,所有线程退出循环

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

我的问题是退出
线程main
只更改全局变量。 在
线程主线程中
如果我这样做

while (go && accept(params)) {}
它不进入while循环

所以目前代码是

while (go) {
    accept(params);
    // Do stuff
}
当我将
go
设置为零时,它等待
accept
,因此我必须创建一个新连接,它接受连接,然后退出线程,因为
go
变为零

线程工作程序也有同样的问题

while (go && read(socket_id, buffer, sizeof(char)) > 0) {}
它等待套接字中的字符退出循环

我看不到只使用
go
var退出循环的方法。 我想我得把插座关上,或者换个方法,我错了吗

我对退出线程的其他方法不感兴趣,只是想知道是否可以通过更改go变量退出循环


谢谢

假设您为
SIGINT
SIGTERM
设置了一个信号处理程序,以将
go
切换到
=0
您还需要为处理程序取消设置
SA_RESTART
标志,这将使
accept()
在信号接收时返回
-1

为此,请使用设置信号处理程序。对于传入的
struct sigaction
不要将成员
sa_标志
设置为保持
sa_重启

有关受
SA_RESTART
标志影响的系统调用的详细说明,请参阅的“信号处理程序中断系统调用和库函数”一节



独立于此,确保定义了
go
sig_-atomic\u t

listen
未阻塞。你的意思是接受吗?@immibis是的,对不起,让我更新一下问题。如何切换
go
?@alk我在main()函数中有一个信号处理程序。它工作得很好,因为当我将它设置为0时,其他人(go)(里面没有接受或读取)退出W,谢谢!我从这个答案中学到了很多:-)它确实很有效,而且我还有新的东西要读和学!再次感谢!