[英]Self implementation of pipe, how to know how many processes has file descriptors to my pipe?
[英]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_program
, popen()
派生并执行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个打开的描述符,并且暂时有第三个。
- 当您说“父进程安排管道的一端关闭”时,您的意思是读取文件描述符(
stdin
)?
根据popen()
的mode参数,立即关闭父管道中管道的两端之一;否则,将其关闭。 另一个由pclose()
关闭。 文件描述符从来都不是用于标准输入或标准输出的文件描述符-您必须经过极高的回转才能使其成为标准I / O通道之一。
- 是否所有通过
popen()
进程都确保它们使用dup()
以确保它们使用stdout和stdin?
每个管道都有一个读取端和一个写入端。 以popen("ls", "r")
; 您的程序从ls
进程读取。 它( popen()
)创建一个管道和叉子。 在子级中,在执行命令之前,将管道的写端连接到stdout
( dup2()
或dup()
),并关闭管道的读端。 在父级中,将管道的读取端“转换为”或“附加到”流( fdopen()
,或多或少),并关闭管道的写入端。 在父进程中,管道永远不会连接到stdout或stdin。
在子进程中,根据popen()
的mode参数,将标准输入或标准输出连接到管道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.