2015-07-21 283 views
0

我有一个线程我提出来接受传入的连接:关闭文件描述符

pthread_t thread; 

pthread_create(&thread, NULL, worker_func, NULL); 
pthread_detach(thread); 

然后worker_func作用:

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

但是,如果我尝试在我原来的关闭GlobalFD线程,接受仍然会阻塞(如果GlobalFD关闭,我希望它失败)。我在网上查看了其他问题,似乎无法找到解决特定问题的答案。

任何想法? 谢谢

回答

2

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

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

+0

但是,当我关闭'GlobalFD'我想接受失败,以便线程将优雅地关闭!编辑我的主要问题。 – pika

+1

@pika,回答更新 –

+0

似乎'pthread_kill(thread,SIGINT)'没有效果,有或没有信号处理程序。然而它返回0,这意味着它发送了信号。 – pika

1

通常,在一个线程中关闭文件描述符并不保证会导致正在等待另一个线程中该文件描述符返回的函数。你的选择是1)安装一个信号处理程序并使用pthread_kill()(不要忘记检查被阻止的函数的返回码)并且2)创建一个“终止文件描述符”,它也被传递给select()或poll()函数并将其关闭或写入其他线程中。

祝你好运。