2016-05-02 70 views
1

我使用recv()來從套接字讀取數據,並且使用fcntl()來設置套接字阻塞/非阻塞。我的問題是:如果我調用recv()(阻塞),並且我從另一個線程調用fcntl()並設置套接字非阻塞,那麼當前正在運行的recv()返回或fcntl()的效果將僅在阻塞recv()返回後發生,我稱之爲再次?Blocking recv()vs fcntl()

+2

試一試。奇怪的是,你想要一個套接字既是阻塞又是非阻塞的,並且有另一個線程處理狀態。在linux上,我將使用客戶端上的socket()和服務器上的accept4()來設置創建時的套接字非阻塞。 –

+0

你只是試圖異步喚醒一個阻塞在'recv'調用的線程嗎?如果是這樣,即使'fcntl'產生期望的結果,也可能有更好/更安全的方法。例如,使用'poll'來阻止外部'recv'套接字*或*一個僅用於進程內通知的內部套接字。 –

+0

@BrianMcFarland這正是我計劃要做的事情,但由於它根本不可行(根據EJP的回答),我會研究你的想法。謝謝! –

回答

2

它不會影響當前的接收操作。

奇怪的事情要做。

+0

感謝您的回答!我想用這種方法喚醒阻塞線程,但我想我會考慮其他選項。 –

+0

@BertalanRadostyan:「*我想喚醒阻塞線程*」只需發送線程信號(確保'SA_RESTART'不是信號處理程序)。 – alk