当多个进程尝试从同一个管道读取时会发生什么?

URL*_*L87 2 c

#include <unistd.h>
#include <stdio.h>
int main()
{
  char buff[100];
  int pfd[2];
  buff[0] = '\0';
  pipe(pfd);
  if (fork())
    write(pfd[1],"hello world", 12);
  fork();
  read(pfd[0], buff, 100);
  printf("%s\n", buff);
  printf("goodbye\n");
}
Run Code Online (Sandbox Code Playgroud)

我知道只有一个进程会写入管道,但我不明白的是,一个进程是否有可能从管道中读取数据并仅读取“hello world”的一部分,而其他进程读取其他部分“你好世界”?

换句话说,当一个进程尝试读取管道而另一个进程正在读取它时会发生什么?

Mat*_*ner 5

恶魔会从你的鼻子里飞出来!

实际上,如果它们从同一个管道读取,那么它们将持有指向内核中相同管道的文件描述符。struct file这意味着内核将决定谁获取数据。只有一个进程会读取任何给定的字节。

大多数对管道的读取和写入都有一些关于 的保证PIPE_BUF,您可能想研究一下。