3
我正在嘗試爲我的Linux守護進程編寫一些IPC機制來與其他進程通信。我一直在主要看管道,因爲它比插座更可靠。但是現在我有一個問題:數據報連接是否可以通過管道進行?在Linux中可以使用數據報管道嗎?
目前我正在做這樣的事情(爲清楚起見處理去除錯誤):
mkfifo("path/to/named/pipe1", 0660);
int ret_fd = open("path/to/named/pipe1", O_RDONLY | O_NONBLOCK);
對於插座,我可以做這樣的事情:
sockaddr_un sock;
sock.sun_family = AF_UNIX;
sprintf(sock.sun_path, "path/to/named/pipe1");
unlink(sock.sun_path);
int ret_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); //maybe SOCK_SEQPACKET is better/more reliable
bind(ret_fd, (sockaddr*)(&sock), sizeof(sock));
爲了使它明顯,我主要關心消息邊界,以確保在獲取信號讀取和讀取數據包時獲得完整數據包。
Unix域套接字是可靠的。你認爲管道比插座更可靠嗎? – Brian
大部分只是通過閱讀和對話我已經看到了這一點。我認爲它與套接字上的數據包丟失和緩衝區大小限制有關。 –
這可能是在實際網絡中的情況,但在本地機器上,插座應該非常可靠。你有沒有看過使用共享內存或其他IPC解決方案? – Andrew