gpt4 book ai didi

c - 如果子进程在读取时不关闭管道,会发生什么情况?

转载 作者:IT王子 更新时间:2023-10-29 00:38:53 26 4
gpt4 key购买 nike

给定以下代码:

int main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;

if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(EXIT_FAILURE);
}

if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}

if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */

while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);

write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);

} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
return 0;

}

每当子进程想要从管道中读取时,它必须首先关闭管道的写入端。当我从子进程的 if 中删除那行 close(pipefd[1]); 时,我基本上是说“好吧, child 可以从管道读取,但我允许 parent 同时写入管道”?

如果是这样,当管道同时打开进行读写时会发生什么?没有互斥?

最佳答案

Whenever the child process wants to read from the pipe, it must first close the pipe's side from writing.

如果进程——父进程或子进程——不打算使用管道的写端,它应该关闭那个文件描述符。同样对于管道的读取端。系统将假设在任何进程打开写端时都可能发生写入,即使唯一的此类进程是当前正在尝试从管道读取的进程,因此系统不会报告 EOF。此外,如果管道过满并且仍然有一个进程打开读取端(即使该进程正在尝试写入),那么写入将挂起,等待读取器为写入完成腾出空间。

When I remove that line close(pipefd[1]); from the child's process IF, I'm basically saying that "okay, the child can read from the pipe, but I'm allowing the parent to write to the pipe at the same time"?

没有;你是说 child 可以像 parent 一样到管道。任何具有管道写入文件描述符的进程都可以写入管道。

If so, what would happen when the pipe is open for both reading and writing — no mutual exclusion?

从来没有任何互斥。任何打开管道写描述符的进程都可以随时写入管道;内核确保两个并发的写操作实际上是序列化的。任何打开管道读取描述符的进程都可以随时从管道读取;内核确保两个并发读取操作获得不同的数据字节。

通过确保只有一个进程打开它进行写入并且只有一个进程打开它进行读取来确保单向使用管道。但是,这是一个编程决定。你可以有 N 个进程打开写端和 M 个进程打开读端(并且,废除这个想法,N 组和 M 组进程之间可能有共同的进程),它们都能够出奇地清醒地工作。但是您无法轻易预测数据包在写入后将在何处读取。

关于c - 如果子进程在读取时不关闭管道,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599462/

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