【问题标题】:Combine fork,fifo and execlp?结合fork,fifo和execlp?
【发布时间】:2016-01-26 07:02:23
【问题描述】:
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);
  }
}

我有这段代码,但由于某种原因,当我执行它时,进程冻结,没有打印,也没有退出(我必须按 CTRL+C)。 知道为什么吗?我尝试了同样的事情,但是使用了内部管道并且它起作用了。

【问题讨论】:

    标签: c unix exec fork fifo


    【解决方案1】:

    来自mkfifo

    一旦你以这种方式创建了一个 FIFO 特殊文件,任何进程都可以 以与普通文件相同的方式打开它进行读取或写入。 但是,它必须同时在两端打开,然后才能使用 继续对其进行任何输入或输出操作。打开 FIFO 正常读取会阻塞,直到其他进程打开相同的 FIFO 用于写入,反之亦然。

    父进程在wait(NULL)等待子进程完成,但是子进程在调用open("view",O_WRONLY)之后在另一端等待有人打开"view"


    要获得有效的以空字符结尾的字符串,您还需要将 resp 初始化为零 char resp[100] = { 0 }; 或在读取输出的末尾放置零:

    ssize_t size = read(fd,resp,20);
    resp[size] = '\0';
    

    【讨论】:

      【解决方案2】:

      如果我从父进程中删除 wait(NULL),它会完美运行。但我真的不知道为什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        相关资源
        最近更新 更多