gpt4 book ai didi

c++ - Linux 中可以使用数据报管道吗?

转载 作者:太空狗 更新时间:2023-10-29 22:58:26 26 4
gpt4 key购买 nike

我正在尝试为我的 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)可靠地通过管道传输数据报。此长度的所有写入都是原子的,并且此长度的所有读取将从管道的缓冲区中提取单个数据报。

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

但是:

I have been looking at mainly pipes to do this since it is more reliable than sockets

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

关于c++ - Linux 中可以使用数据报管道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40618982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com