gpt4 book ai didi

c - 运行该程序后创建/涉及多少个文件描述符 - 管道

转载 作者:行者123 更新时间:2023-11-30 15:04:14 26 4
gpt4 key购买 nike

从下面的程序中,

/***************************************************************************** 
MODULE: popen.c
*****************************************************************************/
#include <stdio.h>

int main(void)
{
FILE *pipein_fp, *pipeout_fp;
char readbuf[80];

/* Create one way pipe line with call to popen() */
if (( pipein_fp = popen("ls", "r")) == NULL)
{
perror("popen");
exit(1);
}

/* Create one way pipe line with call to popen() */
if (( pipeout_fp = popen("sort", "w")) == NULL)
{
perror("popen");
exit(1);
}

/* Processing loop */
while(fgets(readbuf, 80, pipein_fp))
fputs(readbuf, pipeout_fp);

/* Close the pipes */
pclose(pipein_fp);
pclose(pipeout_fp);

return(0);
}
<小时/>

popen.c 编译为 my_program

这是我对执行my_program后创建/涉及的文件描述符的理解,popen() fork 并执行my_program进程,但子进程进程不继承my_program的管道文件描述符。

所以,执行后,

1) 仅为ls创建写文件描述符

2) 读取文件描述符仅为排序创建

3) 在 my_program 中创建读写文件描述符,因为 ls 写入 my_programsortmy_program

读取

enter image description here

<小时/>

如上所示,这些是唯一涉及/创建的文件描述符吗?

注意:“in”和“out”只是此处使用的命名约定

最佳答案

来自 fork() 的子进程与父进程具有完全相同的一组打开文件描述符。

popen() 调用使用 pipe() 创建两个文件描述符;然后它执行fork()。父进程安排管道的一端关闭,另一端转换为文件流 (FILE *)。子进程关闭管道的另一端,并安排该一端成为进程的标准输入 ("w") 或标准输出 ("r")它执行(使用 dup()dup2() 执行任务)。

你使用了popen()两次;您最终会在父级中得到 2 个打开的描述符,并且短暂地出现第三个。

  1. When you say, 'the parent process arranges that one end of the pipe is closed', do you mean read file descriptor (stdin)?

根据popen()的模式参数,父级管道的两端之一立即关闭;另一个由pclose()关闭。文件描述符“绝不”是标准输入或标准输出的描述符 — 您必须经历非凡的旋转才能使其成为标准 I/O channel 之一。

  1. Do all process thru popen() make sure they dup() to make sure they use stdout & stdin?

每个管道都有一个读端和一个写端。取popen("ls", "r");您的程序从 ls 进程读取。它 (popen()) 创建一个管道和 fork 。在子进程中,管道的写入端连接到 stdout(dup2() 或可能是 dup()),读取端连接到 stdout在执行命令之前,管道的已关闭。在父级中,管道的读取端被“转换”或“附加”到流(或多或少是fdopen()),并且管道的写入端被关闭。在父进程中,管道永远不会连接到 stdout 或 stdin。

在子进程中,标准输入或标准输出连接到管道,具体取决于 popen() 的模式参数。

关于c - 运行该程序后创建/涉及多少个文件描述符 - 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365683/

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