2013-03-19 51 views
1

我在學習管道和叉子。在這種情況下,我試圖從父母向孩子寫同一個詞。下面是一些練習代碼我寫的(四個孩子):從一位家長寫信給多個孩子?

#define MAXWORD 5 

int main() { 

    pid_t parentID, pid, fd[2]; 
    int i, j, k; 
    int status = 0; 
    char toWrite[5] = "abcd"; 

    pipe(fd); 
    parentID = getpid(); 

    for (i = 0; i < 4; i++) { 

     if (getpid() == parentID) { 
      pid = fork(); 
     } 

     if (pid < 0) { 
      perror("fork"); 
      exit(1); 

     } else if (pid == 0) { 
      close(fd[1]); 

      printf("Reading ...\n");    
      char buf[MAXWORD]; 
      read(fd[0], buf, MAXWORD); 

      printf("CHILD : %d\tread : %s\n", getpid(), buf); 

      exit(0); // edited 

     } 

    } 

    for (k = 0; k < 4; k++) { 
     if (getpid() == parentID) { 
      close(fd[0]); 
      printf("Writing ...\n"); 
      write(fd[1], toWrite, MAXWORD); 

      wait(&status); // edited 
     } 
    } 

    return 0; 
} 

下面是從代碼的輸出:

Reading ... 
Writing ... 
CHILD : 1457 read : abcd 
Writing ... 
Reading ... 
Reading ... 
Writing ... 
Writing ... 
CHILD : 1458 read : abcd 
CHILD : 1457 read : abcd 
Reading ... 
Reading ... 
CHILD : 1458 read : abcd 
Reading ... 
Reading ... 
Reading ... 
CHILD : 1458 read : abcd 
CHILD : 1459 read : 
Reading ... 
CHILD : 1459 read : 
CHILD : 1460 read : 
CHILD : 1457 read : abcd 
Reading ... 
CHILD : 1457 read : abcd 

如果我把寫報表否則,如果條款中的環路,將分叉完成它工作正常。但是,如果我在孩子創建後嘗試寫作,則效果不佳。

編輯:添加標記爲「編輯」的行後,該程序按預期工作。這是否是正確的做法?

和投入讚賞。謝謝。

回答

1

當父母退出時,管道關閉。然後,孩子們將讀取0字節的內容。 (您應該檢查讀取的返回代碼。)由於循環,每個孩子也讀取N次。第一個孩子4次,第二個孩子3次,等等。由於所有的孩子都在閱讀同一個管道,他們中的任何一個都可以滿足閱讀。

+0

你提出的最後一點一直困擾着我。我應該沒有寫入循環? – isal 2013-03-19 01:51:04

+1

一種常用的方法是將孩子分成一個循環。然後在循環之後,使用if(getpid()!= parentID)在其周圍進行讀取。這將導致每個孩子讀一次。這意味着每個孩子都會得到一次寫作。 – 2013-03-19 01:54:26

+0

啊,呃!這很好。但是,如果寫也是類似的? – isal 2013-03-19 02:03:30

相關問題