我正试图为我的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));
为了显而易见,我主要关注的是消息边界,以确保我在得到阅读信号和阅读时获得完整的数据包。