gpt4 book ai didi

c - popen() 在 Linux 上调用,这几行是做什么的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:29 24 4
gpt4 key购买 nike

我是系统编程新手,碰巧经历了popen()调用。这是 Linux 上 popen() 实现的代码片段。

dup2() 调用将关闭后面的参数,而前面的参数在子进程中被显式关闭。看起来这两个描述符都已关闭。

为什么这东西还能用?我无法理解代码的工作原理。

switch (pid = vfork()) {
case -1: /* error */
(void) close(pdes[0]);
(void) close(pdes[1]);
return (NULL);
/* NOTREACHED */
case 0: /* child */
if (*type == 'r') {
if (pdes[1] != fileno(stdout)) {
(void) dup2(pdes[1], fileno(stdout));
(void) close(pdes[1]);
}
(void) close(pdes[0]);
} else {
if (pdes[0] != fileno(stdin)) {
(void) dup2(pdes[0], fileno(stdin));
(void) close(pdes[0]);
}
(void) close(pdes[1]);
}
execl("/bin/sh", "sh", "-c", program, NULL);

最佳答案

dup2 表示dup将文件描述符dup2(pdes[1], fileno(stdout)); 正如 Linux dup2(2) 手册页所说:

dup2() makes newfd be the copy of oldfd, closing newfd first if necessary

因此这两行

(void) dup2(pdes[1], fileno(stdout));
(void) close(pdes[1]);

首先关闭旧的 stdout 文件描述符,然后复制管道端点 pdes[1] 到 stdout 文件描述符 - 现在有 2 指向同一管道的文件描述符。然后我们关闭原来的管道端点,但复制的端点保持打开状态。


顺便说一句,严格来说,fileno(stdout) 是不正确的。它返回 FILE *stdout 正在包装的文件编号,如果完全打开。相反,您应该在那里使用 STDOUT_FILENO0

关于c - popen() 在 Linux 上调用,这几行是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656950/

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