2015-10-27 227 views
2
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)。 任何想法为什么?我尝试了同样的事情,但使用内部管道,它工作。Combine fork,fifo和execlp?

回答

0

从人mkfifo

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

父进程中等待wait(NULL)为孩子完成,但孩子则等待有人来电话open("view",O_WRONLY)后在另一端打开"view"


有一个有效的空结束的字符串,你还需要通过零char resp[100] = { 0 };初始化resp或将为零读取输出的末尾:

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

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