Io

一個程序可以有一個非阻塞的描述符,而另一個程序有一個描述符引用同一個阻塞的文件/套接字嗎?

  • September 23, 2020

我對套接字比對正常文件更感興趣,但基本上我想知道一個程序是否可以將套接字“視為”阻塞,而另一個程序可以將其視為非阻塞。我猜是的,核心根據系統呼叫中使用的選項來處理所有這些。

我想這更多是關於 Unix 域套接字而不是 TCP 套接字,因為我不認為 2 個不同的程序可以使用相同的 TCP 套接字(但我可能是錯的)

你猜錯了。

唯一可以更改的每個文件描述符的屬性是close fcntl(F_SETFD)- FD_CLOEXECon-exec 標誌。

所有其他屬性要麼是每個文件對象(POSIX 術語中的“打開文件描述”——可以用 更改fcntl(F_SETFL)),要麼是每個 inode。

fcntl(F_SETFL, | O_NONBLOCK)使用或使用設置非阻塞標誌ioctl(FIONBIO)將影響引用該打開文件的所有文件描述符。也沒有辦法使文件非阻塞僅用於讀取或寫入。

遠非理想——您還可以參考StackOverflow 上的這個問答,尤其是 lkml討論的連結,該連結討論了以某種方式修復它失敗的嘗試。

請注意,正常文件基本上是非阻塞的——它們上的 a poll(2)orselect(2)將立即返回。

如果你只對套接字感興趣,你應該使用orsend(2)標誌而不是or 。與您所說的相反,套接字文件描述符可以在程序之間共享,無論它的系列/協議/選項是什麼。這也適用於監聽套接字。recv(2)``MSG_DONTWAIT``read(2)``write(2)

引用自:https://unix.stackexchange.com/questions/508372