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));
为了使它明显,我主要关心消息边界,以确保在获取信号读取和读取数据包时获得完整数据包。
Unix域套接字是可靠的。你认为管道比插座更可靠吗? – Brian
大部分只是通过阅读和对话我已经看到了这一点。我认为它与套接字上的数据包丢失和缓冲区大小限制有关。 –
这可能是在实际网络中的情况,但在本地机器上,插座应该非常可靠。你有没有看过使用共享内存或其他IPC解决方案? – Andrew