繁体   English   中英

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

[英]How many file descriptors created/involved after running this program - pipe

在以下程序中,

/***************************************************************************** 
 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之后创建/涉及的my_programpopen()派生并执行my_program进程,但是子进程不会继承my_program的管道文件描述符。

所以,在执行人员之后,

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

2)读取文件描述符仅用于sort

3)在my_program中创建读写文件描述符,因为ls写入my_program并从my_program sort读取

在此处输入图片说明


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

注意:“输入”和“输出”只是此处使用的命名约定

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

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

您使用popen()两次; 您最终在父级中有2个打开的描述符,并且暂时有第三个。

  1. 当您说“父进程安排管道的一端关闭”时,您的意思是读取文件描述符( stdin )?

根据popen()的mode参数,立即关闭父管道中管道的两端之一;否则,将其关闭。 另一个由pclose()关闭。 文件描述符从来都不是用于标准输入或标准输出的文件描述符-您必须经过极高的回转才能使其成为标准I / O通道之一。

  1. 是否所有通过popen()进程都确保它们使用dup()以确保它们使用stdout和stdin?

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

在子进程中,根据popen()的mode参数,将标准输入或标准输出连接到管道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM