gpt4 book ai didi

c - 父进程中的 read() 是否等待管道中的子 write()?

转载 作者:行者123 更新时间:2023-12-04 00:12:12 28 4
gpt4 key购买 nike

我想在 C 中的 child 作家和家长读者之间建立一个管道。
我以为我的父进程必须等待其子进程写入缓冲区才能读取它,但后来我想检查它,所以我编写了以下代码:

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;

输出出乎意料地(或者不是?) received: hello
如果我用 for (volatile int i = 0; i < some_big_int; ++i); 循环替换对 sleep() 的调用,则输出相同。
我不认为对 read() 的调用会阻止我的父进程,直到 child 在管道的另一端写入,但我无法解释这种行为。任何提示?

最佳答案

read 将阻塞,直到至少有一个字节要读取,或者遇到错误,或者到达流的末尾。当至少要读取一个字节时,它将读取尽可能多的字节(最多您指定的最大数量),然后返回。

在这种情况下,父进程对 read 的调用将阻塞,直到子进程 write 向管道发送某些内容。

man 7 pipe 部分 I/O on Pipes 和 FIFO :

If a process attempts to read from an empty pipe, then read(2) will block until data is available. If a process attempts to write to a full pipe (see below), then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete. Nonblocking I/O is possible by using the fcntl(2) F_SETFL operation to enable the O_NONBLOCK open file status flag.

关于c - 父进程中的 read() 是否等待管道中的子 write()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958589/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com