gpt4 book ai didi

c - Unix C 管道问题

转载 作者:太空狗 更新时间:2023-10-29 15:12:39 27 4
gpt4 key购买 nike

我正在尝试了解管道的用法。

父进程将管道,如果父进程 fork ,则子进程将继承管道。所以现在我们有一个直接链接到子进程并且他们可以通信?

当我们开始关闭管道和重定向管道时,我迷路了。有没有人对关闭管道和重定向管道有很好的解释?

提前致谢。

最佳答案

这是交易。

  1. 管道是一种软件抽象,它有两端,每一端都是一个 fd。无论您在一端写什么(写 fd),都可以在另一端读出(读 fd)。
  2. 使用管道的诀窍是用管道的读取 fd 切换某些进程的标准输入。现在,你可以写入管道的写fd,当另一个进程读取他认为是他的标准输入时,他实际上读取管道的读fd(并获取你的数据)。
  3. 对于双向通信,你可以得到另一个管道,并用管道的写fd切换进程的stdout。现在,无论进程写入其标准输出,您都可以读取管道的读取 fd。

这是它的样子:

P1=[WR FD]===========[RD FD]=[STDIN]=P2
P1=[RD FD]===========[WR FD]=[STDOUT]=P2

P1 and P2 are processes. And "===" depict the pipes.

您的问题专门针对关闭和重定向。当您执行我之前提到的切换时,它就会发挥作用。假设您通过使用 pipe() 系统调用获得了一个管道。

int fd[2];
pipe(fd);

现在您创建一个子进程,并在该进程中执行切换,如下所示:

if (!fork()) // 0 return value indicates that you are in the child process
{
dup2(fd[0], 0); // dup2 first closes 0 in the child process, then duplicates
// fd[0] as 0; keep in mind that 0 is stdin and fd[0] is the
// read end of the pipe

exec(something); // start the new process, which when it reads stdin, will be
// reading the pipe instead
}

关于c - Unix C 管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918978/

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