2015-02-09 28 views
0
#include<stdio.h> 
int main() 
{ 
     int pid = fork(); 
     int one[2]; 
     int two[2]; 
     int fp=pipe(one); 
     int sp=pipe(two); 
     int i; 
     char *c1,*c2,a1[8],a2[8]; 
     c1="doggy"; 
     c2="wangwang"; 
     if(fp<0||sp<0) 
     perror("pipe failed\n"); 
     if (pid == 0) 
     { 
       close(one[1]); 
       close(two[0]); 
       for (i = 0; i < 5; i++) 
       { 
         read(one[0],a1,10); 
         printf("%d. %s\n", i + 1,c1); 
         write(two[1],c2,10); 
       } 
     } 
     else 
     { 
       close(one[0]); 
       close(two[1]); 
       for (i = 0; i < 5; i++) 
       { 
         printf("%d. %s\n", i + 1,c2); 
         write(one[1],c1,8); 
         read(two[0],a2,8); 
       } 


       wait(NULL); 
                          } 
} 

我想通過管道同步父進程和子進程。但是在這個代碼中,在gdb中,我總是收到SIGPIPE信號,然後管道破裂。爲什麼? 代碼有什麼問題?爲什麼我的過程總是收到SIGPIPE信號,然後管道破裂。我在gdb中看到它

+0

問:用這段代碼什麼*正確*?問:你爲什麼打開* fp和sp? 「one []」和「two []」在哪裏初始化? – FoggyDay 2015-02-09 00:13:32

+0

嘗試在安裝管道後移動叉子呼叫 – chris 2015-02-09 00:15:15

+0

如果下面的答案解決了您的問題,那麼接受它將會是件好事... – tink 2015-02-09 00:46:44

回答

2

您需要在叉子前設置管道。 fork()會克隆內存,所以如果你事後設置管道,你不會得到一個管道與兩個實例連接,但兩個沒有連接的管道。此外,如果您有兩根管道並從中進行讀寫,則會非常危險。這可能會陷入僵局,所以要小心(在你的例子中,我認爲它沒問題)。

+0

謝謝!你的回答是正確的!我會小心的。 – 2015-02-09 00:33:43

相關問題