数据报管道在Linux中是否可行?

时间:2016-11-15 20:20:49

标签: c++ linux sockets pipe

我试图为我的Linux守护程序编写一些IPC机制来与其他进程通信。我一直在寻找主要用于管道的管道,因为它比插座更可靠。但现在我的问题是数据报连接是否可以通过管道进行?

目前,我正在做类似的事情(为清晰起见,删除了错误处理):

mkfifo("path/to/named/pipe1", 0660);
int ret_fd = open("path/to/named/pipe1", O_RDONLY | O_NONBLOCK);

对于socket,我可以这样做:

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));

为了表明这一点,我主要关注消息边界,以确保在收到信号以便阅读和阅读时获取完整数据包。

1 个答案:

答案 0 :(得分:1)

正如Brian McFarland的评论所指出的,通过选择固定的数据报长度(必须小于PIPE_BUF),您可以通过管道可靠地传输数据报。这个长度的所有写入都是原子的,所有这个长度的读取都将从管道缓冲区中提取一个数据报。

此外,man page for pipe表示您可以将O_DIRECT标志用于“数据包模式”,以确保将write小于PIPE_BUF个字节视为数据包和read操作将检索单个数据包。然而,目前尚不清楚这是否也适用于命名的fifos。

然而:

  

我一直在寻找管道来做这件事,因为它比套接字更可靠

这不正确。 Linux上的Unix数据报套接字是可靠的并且保留了消息顺序。在这里,它们看起来非常合适。