2013-04-22 38 views
0
#include<dirent.h> 
#include<string.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 

int main() 
{ 
    int canal_son[2]; 
    int canal_father[2]; 
    pipe(canal_father); 
    pipe(canal_son); 
    char mesaj_son[20]; 
    char mesaj_father[20]; 

    if (fork()==0) 
    { 
     printf("Son %d\n",getpid()); 
     read(canal_father[0],mesaj_father,4); 
     int j; 
     for(j=0;j<5;j++) 
     { 
      printf("The message from father is: %s \n",mesaj_father); 
      read(canal_father[0],mesaj_father,4); 
      write(canal_son[1],"son",3); 
     } 
     exit(0); 
    } 

    int i=5; 
    for (i=0;i<5;i++) 
    { 
     write(canal_father[1],"mesas",4); 
     read(canal_son[0],mesaj_son,10); 
     printf("we are in father:%s\n",mesaj_son); 
    } 
} 

我所試圖做的是創造管材孩子和父親之間通信的母公司之間的通信,唯一的問題是,當我嘗試同時使用,我的過程凍結,它就像是在等待一些輸入,如果我只使用一根管道,canal_father或canal_son,它可以完美地工作,有沒有人知道使用2根管道有什麼問題?管孩子,並使用2管

非常感謝。

回答

1

您的孩子正在嘗試從父母的管道中讀取兩次。結果 孩子和父母都在等待對方開始寫作。

事件的全序列是這樣的:

  1. 父寫入孩子。
  2. 孩子從父母讀取。
  3. 父母等待從孩子讀取。
  4. 孩子等待從父母讀取。

要修復此問題,請從循環中讀取子文件後移除多餘的讀數並移動打印輸出 。所以子代碼看起來像這樣:

printf("Son %d\n",getpid()); 
    int j; 
    for(j=0;j<5;j++) 
    { 
     read(canal_father[0],mesaj_father,4); 
     printf("The message from father is: %s \n",mesaj_father); 
     write(canal_son[1],"son",3); 
    } 
    exit(0); 
1

你的代碼結構的方式,兒子試圖從父親讀兩個消息寫入一個之前,而爸爸寫一個消息,然後嘗試讀取之一。所以兒子阻塞第二次讀取(循環中的一個,j = 0),而父親在第一次讀取時阻塞(i = 0)。

而且,因爲你永遠不關閉任一過程的任何寫的結束(有4 - 兩個兒子,兩個在父親),你永遠不會得到任何讀正交函數。這不是真正的問題,因爲你永遠不會等待一個eof,但如果你嘗試做更復雜的事情可能會成爲一個問題。

最後,您正在編寫的消息不包括字符串的終止NUL(),所以當您將它們傳遞給printf時,它們沒有終止,這會導致問題。您需要在寫入的數據中包含NUL,或者從讀取調用中讀取長度(返回值)並明確終止字符串。

在任何情況下,你應該檢查讀取的返回值和寫入錯誤的電話。

+0

+1,參議員。 = P(打賭你以前從來沒有聽說過)。合理更新的源代碼示例[可在此處找到](http://ideone.com/14qNTi) – WhozCraig 2013-04-22 17:27:31

1

你讀,寫不同大小的,未終止字符串和做不同數量的讀取和寫入。如果你使尺寸和讀/寫一致,它的作品。

if (fork()==0) 
{ 
    printf("Son %d\n",getpid()); 
    int j; 
    for(j=0;j<5;j++) 
    { 
     printf("The message from father is: %s \n",mesaj_father); 
     read(canal_father[0],mesaj_father,6); 
     write(canal_son[1],"son",4); 
    } 
    exit(0); 
} 

int i=5; 
for (i=0;i<5;i++) 
{ 
    write(canal_father[1],"mesas",6); 
    read(canal_son[0],mesaj_son,4); 
    printf("we are in father:%s\n",mesaj_son); 
}