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

Interrupt a accept() that is waiting, just changing a global variable value

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

规范文件中写着:

The main thread does a controlled loop on the global var go, and at each cycle waits for a connection request by an user

还有:

Server stops with SIGTERM or SIGINT. When signal is received, the global var go is set to zero, and all threads exit from the loop cycle

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

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

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

不进入while循环

所以目前代码是

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

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

thread worker

同样的问题
while (go && read(socket_id, buffer, sizeof(char)) > 0) {}

它等待来自套接字的字符退出循环。

我看不到仅使用 go 变量退出循环的方法。 我想我必须关闭套接字,或者找到其他方法,我错了吗?

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

来退出循环

谢谢!

假设您为 SIGINTSIGTERM 设置了信号处理程序以将 go 切换为 !=0 您还想取消设置 SA_RESTART 标志处理程序,这将使 accept() return -1 接收到信号。

为此,使用 sigaction() 设置信号处理程序。对于你传入的struct sigaction,不要将成员sa_flags设置为持有SA_RESTART

有关哪个系统调用受 SA_RESTART 标志影响的详细说明,请参阅“信号处理程序中断系统调用和库函数部分" man 7 signal.


独立于此确保 go 已定义 sig_atomic_t