2015-07-21 282 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()函數並將其關閉或寫入其他線程中。

祝你好運。