2016-11-15 45 views
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)); 

爲了使它明顯,我主要關心消息邊界,以確保在獲取信號讀取和讀取數據包時獲得完整數據包。

+3

Unix域套接字是可靠的。你認爲管道比插座更可靠嗎? – Brian

+0

大部分只是通過閱讀和對話我已經看到了這一點。我認爲它與套接字上的數據包丟失和緩衝區大小限制有關。 –

+1

這可能是在實際網絡中的情況,但在本地機器上,插座應該非常可靠。你有沒有看過使用共享內存或其他IPC解決方案? – Andrew

回答

1

正如Brian McFarland的註釋,您可以通過選擇固定數據報長度(必須小於PIPE_BUF)在管道上可靠地傳輸數據報。此長度的所有寫入都是原子的,並且此長度的所有讀取操作都會從管道緩衝區中提取單個數據報。

此外,man page for pipe說,可以使用O_DIRECT標誌,其確保小於PIPE_BUF字節的write被視爲一個數據包和一個read操作將檢索單個分組「分組模式」。然而,這還不清楚這是否也適用於命名的fifos。

但是:

我一直在尋找主要管道要做到這一點,因爲它比插座

這是不正確的更可靠。 Linux上的Unix數據報套接字是可靠的,並保留消息順序。在這裏,他們看起來非常合適。

相關問題