2012-03-07 64 views
0

這是一小段代碼,父進程寫入管道和子讀取管道,在父進程中添加'wait()'之前,一切正常。我認爲這應該沒有什麼區別,但是當我輸入時,它就會陷入困境。我對系統編程相當陌生。任何人都可以幫忙嗎?使用wait()時,無法讀取管道?

int main() { 
     char* msg = malloc(sizeof(100)); 
     int fd[2]; 
     pipe(fd); 
     int status; 


if (fork()!=0){ 
    close(fd[0]); 
    dup2(fd[1],1); 
    scanf("%s",msg); 
    puts(msg); 
    wait(&status); 
} 
else { 
    char* buf = malloc(sizeof(100)); 
    close(fd[1]); 
    dup2(fd[0],0); 
    scanf("%s",buf); 
    puts(buf); 
} 
return 0;} 
+1

如果fork返回-1,該怎麼辦?適當的錯誤處理:這是晚餐 – tbert 2012-03-07 08:40:54

回答

0

在致電wait()之前,您必須先沖洗stdout

由於隱式刷新是在父進程退出時完成的,因此您的程序之前沒有使用wait()

+0

它的工作原理!謝啦。 – north212 2012-03-08 02:32:12

1

你忘了父dup2呼叫後關閉fd[1]。此外,您需要編寫一些字符,這會導致scanf意識到它已經讀取了字符串的末尾。撥打puts後關閉標準輸出將是一種方法。

0

您應該advanced unix programming讀一本好書,學會使用複用電話像poll(2)(或select,或pselect,或ppoll),可能學會使用SIGCHLD。請注意,signal處理程序只能調用非常有限的一組函數(異步安全函數),並且應該經常設置一個volatile sig_atomic_t變量。