gpt4 book ai didi

管道可以用来连接同一进程的2个文件描述符吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:19 25 4
gpt4 key购买 nike

这是我的项目声明,但我似乎不太明白什么将标准输出链接到管道的输入端(读取端)。我不是在寻求解决方案,但我对问题的含义感到困惑

Project Statement

项目要求

这个项目模拟了 Unix 管道命令。父进程派生一个子进程,两个进程通过内核管道连接。父进程接受两个命令行参数,它们是两个独立的可执行程序:p1和p2。父进程打开一个内核管道并 fork 一个子进程。这 child 从 parent 那里继承了开放的管道。父进程将其标准输出链接到管道的输入端并关闭输出端,然后用p1替换自己。子进程链接是输出的标准输入管道的末端并关闭输入端,然后 child 用 p2 替换自己。

项目助手

在编写这个程序时,您将学习和使用系统调用 pipe、dup2 和 execlp。Pipe是一种非常简单的进程间通信设计,所有Unix/Linux都支持分布。每个管道都被编码为两个文件描述符 (int fd[2]) 的整数数组。 fd[0] 是管道的输入端,fd 1是管道的输出端。一个子进程继承open来自其父级的管道。谨慎的做法是立即关闭进程中未使用的管道端。

有人能解释一下这行是什么意思“父进程将它的标准输出链接到管道的输入端并关闭输出结束”,据我所知我们无法从 STDOUT_FILENO 中读取,因此调用 dup2 没有任何意义。

最佳答案

链接的问题图片说(在编写答案时添加到问题的 Material - 也将其留在此处,因为我可以留下一些 [sic] 评论):

This project simulates Unix pipe command. …

The parent process takes in two command-line arguments, which are two independent executable programs: p1 and p2. The parent open [sic] a kernel pipe and forks child process. The child inherits the open pipe from parent.

The parent process links its standard output to the input end of the pipe and closes the output end, then it replaces itself with p1. The child process links is [sic] standard input to the output end of the pipe and closes the input end, then the child replaces itself with p2.

… Each pipe is coded as an integer array of two file descriptors (int fd[2]). fd[0] is the input end of the pipe, and fd[1] is the output end of the pipe. …

定义了术语“输入端”和“输出端”。

您需要将读取描述符 (fd[0]) 连接到写入 channel (FILENO_STDOUT),这“可以完成”但通常没有意义. channel 的方向是传统的,确保程序之间的互通。但是你可以颠覆一组程序的惯例——这使得代码在其他情况下毫无用处。除非程序 p1p2 是专门为从文件描述符 1 (FILENO_STDOUT) 读取和写入文件描述符 0 ( FILENO_STDIN),p1 生成的信息将不会中继到 p2

  • 练习中有错误。

您可以完全按照说明去做,并证明它不起作用。您可以创建一个以正统方式行事的可行解决方案,并证明它确实有效。


我还会对术语“管道命令”提出异议。在 macOS 上,有一个名为 pipe(8) 的实际命令:

NAME
pipe - Postfix delivery to external command

SYNOPSIS
pipe [generic Postfix daemon options] command_attributes...

DESCRIPTION
The pipe(8) daemon processes requests from the Postfix queue manager to deliver messages to external commands. This program expects to be run from the master(8) process manager.

| 符号不是命令;它是一种进程间通信的方法,IPC。

更好的描述是:

This project simulates the Unix shell pipe notation p1 | p2.


问题标题是“可以使用管道连接同一进程的 2 个文件描述符吗?”标题中的问题实际上并未在问题正文中提出。标题中问题的答案是"is"。实际上,pipe() 系统调用在同一个进程中创建了两个文件描述符,它们相互连接,以便可以从另一个文件描述符读取写入其中一个文件描述符的数据。这就是 pipe() 系统调用的要点。

如果你需要在一对特定的文件描述符之间建立链接,你必须调用 pipe(),然后是 dup2() 两次,然后是 close() 两次。 pipe() 调用返回 2 个任意文件描述符编号。 dup2() 调用将所需的数字连接到 pipe() 提供的数字; close() 调用断开了 pipe() 返回的数字。唯一需要注意的问题是 pipe() 返回的数字是否与所需数字发生冲突。然后你必须更加小心——可能两次调用 dup() 使用 pipe() 返回的描述符,两次调用 close()pipe() 返回的描述符上,然后两次调用 dup2() 将来自 dup() 的描述符映射到所需的数字,以及对 close() 的两次调用以关闭来自 dup() 的描述符。 (请注意,dup() 为您选择文件描述符;dup2() 允许您指定返回的文件描述符。)

pipe() 仍然有可能返回所需的两个描述符之一;然后 dup() 调用之一返回两个描述符中的另一个。只需将另一个 dup() 添加到序列中即可。在调用 dup2() 之前不要调用 close()

关于管道可以用来连接同一进程的2个文件描述符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471685/

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