hdl*_*hdl 3 c fork ipc pipe wait
我想在 C 中的子写入器和父读取器之间建立一个管道。我认为我的父进程必须等待它的子进程写入缓冲区才能读取它,但后来我想检查所以我写了下面的一段代码:
pipe(fd);
// ... checks for pipe
pid_t pid = fork();
// ... checks for fork
if (pid == 0) {
close(fd[0]);
// Long sleep hoping parent will terminate before the write()
sleep(10);
write(fd[1], "hello", strlen("hello") + 1);
close(fd[1]);
} else {
close(fd[1]);
read(fd[0], buf, sizeof(buf));
printf("received: %s\n", buf);
close(fd[0]);
}
return 0;
Run Code Online (Sandbox Code Playgroud)
输出出乎意料(或者不是?)received: hello。如果我用for (volatile int i = 0; i < some_big_int; ++i);循环替换对 sleep() 的调用,则输出相同。我不认为调用read()会阻止我的父进程,直到孩子在管道的另一端写入,但我无法解释这种行为。任何提示?
read将阻塞直到至少有一个字节要读取,或者遇到错误,或者到达流的末尾。当至少要读取一个字节时,它将读取尽可能多的字节(最多您指定的最大数量),然后返回。
在这种情况下,父进程对 的调用read将阻塞,直到子进程write向管道发送内容。
从管道和 FIFO 上的 I/Oman 7 pipe部分:
如果进程尝试从空管道读取,则 read(2) 将阻塞,直到数据可用。如果进程尝试写入一个完整的管道(见下文),则 write(2) 会阻塞,直到从管道中读取了足够的数据以完成写入。通过使用 fcntl(2) F_SETFL 操作启用 O_NONBLOCK 打开文件状态标志,可以实现非阻塞 I/O。