Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
C 如何中断IO块?_C_Multithreading_Sockets_Signals - Fatal编程技术网

C 如何中断IO块?

C 如何中断IO块?,c,multithreading,sockets,signals,C,Multithreading,Sockets,Signals,我正在研究一个分配多线程服务器客户端模型。它是C语言的,因为这是一个正在进行的任务,我不能共享代码。 这是我的问题 我已经为每个客户端动态创建了线程,当我在服务器上获得CTRL+C时,我需要正确清理资源,在主线程和其他客户端处理线程中,我检查无限块中的KILL变量,如果我收到信号,我将KILL设置为1 但是,当TCP正在等待accept()时,除非它接收到一个客户端连接,否则它不能进行循环。考虑一下这样的情况。我运行服务器,没有连接客户端。我点击CTRL+C,KILL设置为1。但是main()无

我正在研究一个分配多线程服务器客户端模型。它是C语言的,因为这是一个正在进行的任务,我不能共享代码。 这是我的问题

我已经为每个客户端动态创建了线程,当我在服务器上获得
CTRL+C
时,我需要正确清理资源,在主线程和其他客户端处理线程中,我检查无限块中的
KILL
变量,如果我收到信号,我将
KILL
设置为1

但是,当
TCP
正在等待
accept()
时,除非它接收到一个客户端连接,否则它不能进行循环。考虑一下这样的情况。我运行服务器,没有连接客户端。我点击
CTRL+C
KILL
设置为1。但是
main()
无法检查
KILL
,直到
accept()。我试图使用
select()
并给出一个超时,但它在一分钟内冻结了整个机器

activity = select( max_sd + 1 , &readfds , NULL , NULL , &time_val);
有人能给我建议一个更好的方法吗?我是说除了投票


-关于

您可以在后台线程中阻塞accept(),当您想要终止进程时,关闭套接字,accept()调用将终止

你的意思是我必须有单独的线程来实现这个目的,并阻止设置了杀戮时接受吗?因为我看不到你的代码,我不知道你的确切情况,但是对accept()的调用会阻止,直到建立连接或关闭套接字。你说你的主线程在accept()上被阻塞了,所以要么另一个线程需要关闭套接字,要么你需要将accept()调用移动到一个辅助线程。明白了。伟人。我认为这将解决这个问题。荣誉…!)不,不,不。这不起作用,你不能这样做。当另一个线程正在或可能正在使用某个资源时,您无法释放该资源。当一个线程上的另一个线程被阻塞时,您决不能
关闭该线程中的一个套接字。不可能可靠地完成这项工作。考虑这种情况:调用<代码>接受< /代码>的线程在它调用“代码>接受< /COD>”之前被重新安排。由于运气不好,会发生以下情况:一个线程调用
close
来终止进程。另一个线程调用
socket
来获取一个新的socket,该socket获取的文件描述符与
关闭的文件描述符相同。现在,即将调用
accept
的线程被调度,它在错误的端点上调用
accept
。现在,打开新套接字的线程调用
accept
自身。Boom,希望完全使用另一个端点的代码可以接受连接。只需修复
select
代码中的错误,就不会冻结机器。最有可能的是,您错误地重用了读取fd_集。无论如何,当套接字被另一个线程使用时,不要听从Ron Struempf的建议并调用
close