2015-10-27 228 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),它會很完美。但我不知道爲什麼。