2016-11-15 65 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数据报套接字是可靠的,并保留消息顺序。在这里,他们看起来非常合适。

相关问题