C 关闭多线程程序中的文件描述符

C 关闭多线程程序中的文件描述符,c,multithreading,network-programming,C,Multithreading,Network Programming,我创建了一个线程,用于接受以下传入连接: pthread_t thread; pthread_create(&thread, NULL, worker_func, NULL); pthread_detach(thread); 然后worker\u func执行以下操作: <snip> fd = accept(GlobalFD, NULL, NULL); <snip> fd=接受(GlobalFD,NULL,NULL); 但是,如果我试图在原始线程中关闭G

我创建了一个线程,用于接受以下传入连接:

pthread_t thread;

pthread_create(&thread, NULL, worker_func, NULL);
pthread_detach(thread);
然后
worker\u func
执行以下操作:

<snip>
fd = accept(GlobalFD, NULL, NULL);
<snip>

fd=接受(GlobalFD,NULL,NULL);
但是,如果我试图在原始线程中关闭
GlobalFD
,accept仍然会阻塞(如果GlobalFD关闭,我希望它失败)。我在网上和其他问题上都找过了,似乎找不到我这个问题的答案

有什么想法吗?
谢谢

同一程序的不同线程共享内存,包括文件描述符表。如果一个线程关闭一个FD,那么它也将关闭所有其他线程。这是使用多线程和使用多进程之间的区别之一。因此,不要允许一个线程关闭另一个线程依赖的文件描述符以保持打开状态


但是,更一般地说,您必须非常注意修改共享数据。一般来说,您必须通过信号量、条件变量或其他对同步有意义的构造或操作来同步访问。程序行为在其他方面没有很好的定义。特别是,您不能期望关闭文件描述符会导致在不同线程中运行的活动I/O函数终止。改为向目标线程发送信号。

同一程序的不同线程共享内存,包括文件描述符表。如果一个线程关闭一个FD,那么它也将关闭所有其他线程。这是使用多线程和使用多进程之间的区别之一。因此,不要允许一个线程关闭另一个线程依赖的文件描述符以保持打开状态


但是,更一般地说,您必须非常注意修改共享数据。一般来说,您必须通过信号量、条件变量或其他对同步有意义的构造或操作来同步访问。程序行为在其他方面没有很好的定义。特别是,您不能期望关闭文件描述符会导致在不同线程中运行的活动I/O函数终止。改为向目标线程发送信号。

通常,关闭一个线程中的文件描述符并不一定会导致另一个线程中等待该文件描述符的函数返回

您的选项是1)安装一个信号处理程序并使用pthread_kill()(不要忘记检查被阻止函数的返回代码)和2)创建一个“终止文件描述符”,该描述符也会传递给select()或poll()函数,并在另一个线程中关闭或写入它


祝你好运。

通常,关闭一个线程中的文件描述符并不一定会导致另一个线程中等待该文件描述符的函数返回

您的选项是1)安装一个信号处理程序并使用pthread_kill()(不要忘记检查被阻止函数的返回代码)和2)创建一个“终止文件描述符”,该描述符也会传递给select()或poll()函数,并在另一个线程中关闭或写入它


祝你好运。

但是当我关闭
GlobalFD
时,我想接受失败,这样线程就会优雅地关闭!在我的主要问题中编辑。似乎
pthread\u kill(thread,SIGINT)
没有效果,不管有没有信号处理程序。但是它返回0,这意味着它发送了信号。我刚刚决定连接到我自己并发送一个字符串来终止线程。我似乎无法让它工作,否则。谢谢您的帮助。@pika这样做不是一个好主意:当您打开一个新文件时,文件描述符号很有可能被重用。我无法解释信号为什么不起作用。它是否有可能工作,但线程只是循环回执行一个新的
accept()
?至于连接到您自己并发送终止消息,我实际上认为这是非常干净的,只要服务器线程能够区分来自主线程的消息和来自某个随机客户端的消息。否则,它会为DOS攻击提供一个向量。但是当我关闭
GlobalFD
时,我希望accept失败,这样线程就会优雅地关闭!在我的主要问题中编辑。似乎
pthread\u kill(thread,SIGINT)
没有效果,不管有没有信号处理程序。但是它返回0,这意味着它发送了信号。我刚刚决定连接到我自己并发送一个字符串来终止线程。我似乎无法让它工作,否则。谢谢您的帮助。@pika这样做不是一个好主意:当您打开一个新文件时,文件描述符号很有可能被重用。我无法解释信号为什么不起作用。它是否有可能工作,但线程只是循环回执行一个新的
accept()
?至于连接到您自己并发送终止消息,我实际上认为这是非常干净的,只要服务器线程能够区分来自主线程的消息和来自某个随机客户端的消息。否则,它将为DOS攻击提供一个向量。