Io
一個程序可以有一個非阻塞的描述符,而另一個程序有一個描述符引用同一個阻塞的文件/套接字嗎?
我對套接字比對正常文件更感興趣,但基本上我想知道一個程序是否可以將套接字“視為”阻塞,而另一個程序可以將其視為非阻塞。我猜是的,核心根據系統呼叫中使用的選項來處理所有這些。
我想這更多是關於 Unix 域套接字而不是 TCP 套接字,因為我不認為 2 個不同的程序可以使用相同的 TCP 套接字(但我可能是錯的)
你猜錯了。
唯一可以更改的每個文件描述符的屬性是close
fcntl(F_SETFD)
-FD_CLOEXEC
on-exec 標誌。所有其他屬性要麼是每個文件對象(POSIX 術語中的“打開文件描述”——可以用 更改
fcntl(F_SETFL)
),要麼是每個 inode。
fcntl(F_SETFL, | O_NONBLOCK)
使用或使用設置非阻塞標誌ioctl(FIONBIO)
將影響引用該打開文件的所有文件描述符。也沒有辦法使文件非阻塞僅用於讀取或寫入。這遠非理想——您還可以參考StackOverflow 上的這個問答,尤其是 lkml討論的連結,該連結討論了以某種方式修復它失敗的嘗試。
請注意,正常文件基本上是非阻塞的——它們上的 a
poll(2)
orselect(2)
將立即返回。如果你只對套接字感興趣,你應該使用or
send(2)
標誌而不是or 。與您所說的相反,套接字文件描述符可以在程序之間共享,無論它的系列/協議/選項是什麼。這也適用於監聽套接字。recv(2)``MSG_DONTWAIT``read(2)``write(2)