2013-03-19 48 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

相关问题