2017-09-22 118 views
2

我的意思是原子是成功或失敗,什麼都不做。是否寫入SOCK_SEQPACKET原子?

我知道socketpair(AF_LOCAL, SOCK_STREAM)不是原子的,如果多進程/線程調用write(fd, buf, len),則write()的返回值可能> 0 && < len並導致數據不按順序。

如果多個進程/線程write(buf, len)到由socketpair(AF_LOCAL, SOCK_SEQPACKET)創建的sock_fd,它是原子嗎?

我檢查了Linux手冊,發現了一些關於pipe()的內容,它說如果len小於PIPE_BUFwrite/writev是原子的。

我什麼都沒發現socketpair。我寫了一個測試代碼,發現似乎SOCK_SEQPACKET是原子的,我將隨機長度緩衝區寫入fd,返回值總是-1len

回答

1

是的。

任何基於數據報的接口(即 - 您傳遞給write的大小對於執行read的人都可見)必須是原子的。沒有其他辦法可以保證財產。

所以SOCK_SEQPACKET以及SOCK_DGRAM必須是原子才能正常工作。

由於同樣的原因,SOCK_STREAM沒有這樣的原子保證。