数据报管道在Linux中可能吗?
Are datagram pipes possible in Linux?
我正在尝试为我的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数据报套接字是可靠的,并保持消息顺序。
相关文章:
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- GSTREAMER管道播放,但没有填充的回调(仅在Android上发生,在Windows和Linux上可行)
- 如何在 Linux C++ 应用程序中通过管道传输到 ifstream
- 递归执行C 中的Linux管道命令
- 为什么这里的程序体现在Linux中命名的管道的使用情况会遭受种族条件
- 从 Linux 中的多个非阻塞命名管道读取
- 命名管道linux
- Linux 标准输出管道问题
- 无法使用 istream 和 ostream 指针跨 Linux 管道写入
- 在 Linux C++的两个线程之间使用管道的错误/意外行为
- 从 Linux 中的管道/套接字读取所有结构或什么都没有
- 无法写入 Linux 中的管道
- 为什么Linux中的管道会丢失空间
- 每次我在linux c++中为命名管道运行程序时,都会发出SIGSTOP信号
- 在linux中使用命名管道的简单客户端/服务器程序
- 数据报管道在Linux中可能吗?
- 命名管道在c++ Linux检查缓冲区是否已满
- 如何在Linux上的c++中将数据管道到bzip2中并从其标准输出中获得结果数据?
- Linux.Python.从命名管道中读取
- 通过管道/内部linux套接字实现RPC的任何开源C/ c++库/框架