结合fork,fifo和execlp?

时间:2015-10-27 01:03:14

标签: c unix exec fork fifo

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)。 知道为什么吗?我尝试了同样的事情,但使用内部管道,它工作。

2 个答案:

答案 0 :(得分:0)

如果我从父进程中删除wait(NULL),它将工作得很好。但我真的不知道为什么。

答案 1 :(得分:0)

来自男人mkfifo

  

以这种方式创建FIFO特殊文件后,任何进程都可以   以普通文件的相同方式打开它进行读写。   但是,它必须在可以之前同时打开两端   继续对其进行任何输入或输出操作。打开FIFO   用于正常读取块直到某些其他进程打开相同的块   用于写入的FIFO,反之亦然。

父进程在let licenseAccepted = ?等待孩子完成,但是孩子在通话wait(NULL)后等待有人在另一端打开"view"

要获得一个有效的以空字符结尾的字符串,您还需要将open("view",O_WRONLY)初始化为零resp,或者在读取输出结束时将其置零:

char resp[100] = { 0 };