C多个进程写入1个管道

Posted

技术标签:

【中文标题】C多个进程写入1个管道【英文标题】:C multiple processes writing to 1 pipe 【发布时间】:2014-05-18 06:56:03 【问题描述】:

你好Linux系统(Centos 6.5)

我创建了一个管道,然后尝试派生多个子进程。我希望子进程写入同一个分叉。 (我不关心同步性)。我发现只有第一个分叉的进程可以写入所有后续进程得到“错误的文件描述符” 睡眠调用仅用于调试。

示例代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <err.h>

int      pipes[2];
#define FOREVER   for(;;)

int main(int argc, char *argv[])


    int rc;
    int k;
    int nbytes;

    char buffer[4096];

    rc  =   pipe(pipes);
    if  (rc <0)   perror(" Main error with pipes \n"); exit(2); 

    for (k = 0; k < 10; k++)
        
          rc = fork();
          if (rc < 0)   perror(" Main error with pipes \n"); exit(2); 
          if (rc == 0)
             
              /* Child */
              close(pipes[0]);
              sleep(1);
              sprintf(buffer,"%d",k);
              printf("Buffer = ^^%s^^\n",buffer);
              rc = write(pipes[1], buffer, (strlen(buffer)+1));
              perror(" Write result ");
              exit(0);
             
         else 
             
              /* Parent */
              close(pipes[1]);
             
       

    k = 0;  
    sleep(2);

    FOREVER
      
        nbytes = read(pipes[0], buffer, sizeof(buffer));
        printf(" piped %d bytes; buffer = ## %s ##k = %d\n",nbytes,buffer,k++);
      

结果是 管道写入:成功 管道写入:错误的文件描述符 管道写入:错误的文件描述符 管道写入:错误的文件描述符 ...

我假设您不能让 2 个进程写入 1 个管道,但我从未在任何地方看到过这种说法。

谢谢

【问题讨论】:

【参考方案1】:

在第一个孩子分叉后,您正在关闭管道的写入端。

移动

          close(pipes[1]);

for 循环之外。

【讨论】:

以上是关于C多个进程写入1个管道的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止管道中的写入,直到读取发生? (在 C 中)

通过管道从多个子进程写入父进程

C - 在顶层和底层进程之间进行通信

父进程无法读取来自 C 中 4 个不同管道的所有消息

C管道写入/读取双打序列失败

单个管道可以被多个进程连接和读取吗