int main(){
mkfifo("view",0666);
int pid = fork();
if(pid==0){
close(1);
int fd = open("view",O_WRONLY);
dup(fd);
execlp("cat", "cat", "users", NULL);
close(fd);
}
else{
wait(NULL);
int fd = open("view",O_RDONLY);
char resp[100];
read(fd,resp,20);
printf("%s\n",resp);
close(fd);
}
}
我有这段代码,但出于某种原因,当我执行它时,procces冻结,没有打印,没有退出(我必须按CTRL + C)。 知道为什么吗?我尝试了同样的事情,但使用内部管道,它工作。
答案 0 :(得分:0)
如果我从父进程中删除wait(NULL),它将工作得很好。但我真的不知道为什么。
答案 1 :(得分:0)
来自男人mkfifo:
以这种方式创建FIFO特殊文件后,任何进程都可以 以普通文件的相同方式打开它进行读写。 但是,它必须在可以之前同时打开两端 继续对其进行任何输入或输出操作。打开FIFO 用于正常读取块直到某些其他进程打开相同的块 用于写入的FIFO,反之亦然。
父进程在let licenseAccepted = ?
等待孩子完成,但是孩子在通话wait(NULL)
后等待有人在另一端打开"view"
。
要获得一个有效的以空字符结尾的字符串,您还需要将open("view",O_WRONLY)
初始化为零resp
,或者在读取输出结束时将其置零:
char resp[100] = { 0 };