数据报管道在Linux中可能吗?

Are datagram pipes possible in Linux?

本文关键字:管道 Linux 数据报      更新时间:2023-10-16

我正在尝试为我的Linux守护进程编写一些IPC机制,以便与其他进程通信。我一直在寻找主要管道来做到这一点,因为它比插座更可靠。但现在我有一个问题,数据报连接是否可能通过管道?

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

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

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

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

此外,pipe的手册页说,您可以将O_DIRECT标志用于"数据包模式",以确保将小于PIPE_BUF字节的write视为数据包,并且read操作将检索单个数据包。然而,尚不清楚这是否也适用于已命名的fifo。

然而:

我一直在寻找主要管道来做到这一点,因为它比套接字更可靠

这是不对的。Linux上的Unix数据报套接字是可靠的,并保持消息顺序。