C 从1个管道读取多个写入程序

C 从1个管道读取多个写入程序,c,pipe,fork,read-write,xv6,C,Pipe,Fork,Read Write,Xv6,我们正在尝试从给定给多个子进程的管道中读取char*数据。 每个子进程将一个char*写入共享管道,父进程从中读取。 我们要做的是解析在xv6中运行的子进程上的信息。 在解析单个进程时,我们没有遇到任何问题,但在解析管道进程时,递归调用“runcmd”,会出现以下问题: 我们在家长端使用了以下代码: while(read(p[0],buff,sizeof(buff)) > 0){ printf(1,"\nprocess from pipe in main: " ); printf(

我们正在尝试从给定给多个子进程的管道中读取char*数据。
每个子进程将一个char*写入共享管道,父进程从中读取。
我们要做的是解析在xv6中运行的子进程上的信息。
在解析单个进程时,我们没有遇到任何问题,但在解析管道进程时,递归调用“runcmd”,会出现以下问题:
我们在家长端使用了以下代码:

while(read(p[0],buff,sizeof(buff)) > 0){
  printf(1,"\nprocess from pipe in main: " );
  printf(1,buff);
  printf(1,"\n");
}
最后:

char * name = ecmd->argv[0];
char * data=(char*)malloc(strlen(name)*sizeof(char)+strlen(pidc2)*sizeof(char)+3);
strcpy(data,name);
char* delimiter="#";
strcpy(data+strlen(name),delimiter);
strcpy(data+strlen(name)+strlen(delimiter),pidc2);
strcpy(data+strlen(name)+strlen(delimiter)+strlen(pidc2),"\0");
write(pp[1],data,sizeof(char)*(strlen(data)));
当我们使用“ls | cat”运行此代码时,它将打印:

ls#*some_pid*cat#*some_pid*
而不是从每个孩子身上阅读和打印

ls#*some_pid*
cat#*some_pid*

为什么不分开发送呢

因为管道就是这样工作的。在内部,操作系统将来自所有写入程序的数据合并到一个流中。如上所述,您可以让每个写入程序插入某种记录分隔符('\0'或'\n'),然后让读取过程在分隔符处查找并拆分记录


我不知道xv6的具体情况,但传统的类unix系统保证(事实上这是posix.1的要求),任何低于特定长度的消息的写入都是原子的(即,如果两个进程都写入“foo”,读者将看到“foo foo”而不是“ffooo o”或任何其他排列)

不清楚你在问什么。您的子代码没有显示管道代码-非常混乱。大局是什么?您想实现什么?如果将
“\0”
替换为
“\n”
,会发生什么情况?