2014-03-19 52 views
0

我想与父进程沟通子进程。我创建了5个孩子,每个人都发送给管道消息“你好”。但parrent只读一个消息..我很初学者,我不知道我做错了什么......我到目前为止的代码:家长不从管道读取

int main(int argc, char** argv) { 
    int n, p1[2], p2[2]; 
    n = 2*atoi(argv[1]); 
    if(pipe(p1)) ERR("pipe1"); 
    if(pipe(p2)) ERR("pipe2"); 
    create_children(n, p1, p2); 
     if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close"); 
    parent_work(p1); 
    if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close"); 
    return EXIT_SUCCESS; 
} 

void create_children(int number, int p1[2], int p2[2]) { 
    while (number-- > 0) { 
     switch (fork()) { 
      case 0: 
       if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close"); 
       if(TEMP_FAILURE_RETRY(close(p2[0]))) ERR("close"); 
       child_work(p1[1], p2[1]); 
       if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close"); 
       if(TEMP_FAILURE_RETRY(close(p2[1]))) ERR("close"); 
       exit(EXIT_SUCCESS); 

      case -1: ERR("Fork:"); 
     } 
    } 
} 

void child_work(int fd, int fd1, char *name, int which) { 
    char buffer[PIPE_BUF]; 
    size_t *len = (size_t*)buffer; 

    char mb[PIPE_BUF]; 
    snprintf(mb,PIPE_BUF,"%d hello\n",getpid()); 
    if (-1 == TEMP_FAILURE_RETRY (write (fd, mb, (strlen(mb)+1))))/
      ERR ("sending witaj"); 
      else 
      printf("%s\n",mb); 
} 

void parent_work(int fd) { 
    char buffer[PIPE_BUF]; 
    if(TEMP_FAILURE_RETRY(read(fd, buffer, PIPE_BUF))==PIPE_BUF)ERR("read:"); 
    printf("Process send message: %s\n", buffer); 

    while(TEMP_FAILURE_RETRY(wait(NULL))>0); 
} 

当我创建5个孩子,我只获得了1信息。

回答

1

这可不行:

char mb[]=" "; 
snprintf(mb,PIPE_BUF,"%d",getpid()); 
strcat(mb,"hello"); 

你写过去mb结束,因为它与一个空格,然后通过一个NULL字节初始化它只有两个字符空间。在C语言中,当你编写结尾时,数组不会奇迹般地增长,就像你使用snprintfstrcat一样。

从技术上讲,你调用了所谓的未定义的行为,这意味着任何事情都可能发生。

0

孩子们发送空终止的消息,所以如果父母收到一个read中的所有消息,父母将只打印第一条消息。

我建议你让孩子们发送换行符终止的消息(附加一个\n到发送字符串,不要发送空终止符)。

+0

如果我这样做: 'char mb [PIPE_BUF]; snprintf(mb,PIPE_BUF,“%d hello \ n”,getpid());' 它不会发送null? – Ann

+0

这样做,并使用发送长度'strlen(mb)'(而不是'strlen(mb)+ 1')。 –

+0

我仍然没有得到我想要的东西。父母像你说的一样接收所有消息,但是我需要写入“Process send message:%s \ n”,buffer);为每个子进程分开:( – Ann