我正在尝试使用命名管道进行流程内的通信。 这是代码
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
void sigint(int num)
{
int fd = open("np", O_WRONLY);
write(fd, "y", 1);
close(fd);
}
main()
{
char ch[1];
int fd;
mkfifo("np", 0666);
signal(SIGINT, sigint);
fd = open("np", O_RDONLY);
read(fd, ch, 1);
close(fd);
printf("%c\n", ch[0]);
return;
}
我想要的是主要阻止直到写入管道的东西。 问题是信号处理程序sigint()在打开管道后也会阻塞。如果管道已经打开以便在main()之前读取?
,这应该发生吗?答案 0 :(得分:3)
你在open()中阻塞,打开一个fifo来读取块,直到有人打开它进行写作。
打开一个用于编写块的fifo,直到有人打开它进行阅读。
信号处理程序在与main()相同的线程中运行,因此您将遇到死锁。两者都不能打开fifo。
您可以在strace
下运行程序来查看正在进行的操作。
答案 1 :(得分:1)
从手册页:
打开FIFO以便正常读取 阻止直到某个其他进程打开 写入的FIFO相同,副 反之亦然。
和
进程可以打开FIFO 非阻塞模式。在这种情况下, 开放供阅读将成功 即使没有人在写作上打开 方面;开放只写会 ENXIO失败(没有这样的设备或 地址)除非另一端有 已经被打开了。
在Linux下,打开FIFO进行读取 而写作将会成功 阻塞和非阻塞模式。 POSIX 留下这种行为未定义。这个 可用于打开FIFO进行写入 虽然没有读者可用。 一个使用两端的进程 连接以便沟通 与自己一起应该非常小心 避免死锁。