- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我的项目声明,但我似乎不太明白什么将标准输出链接到管道的输入端(读取端)。我不是在寻求解决方案,但我对问题的含义感到困惑
项目要求
这个项目模拟了 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 的方向是传统的,确保程序之间的互通。但是你可以颠覆一组程序的惯例——这使得代码在其他情况下毫无用处。除非程序 p1
和 p2
是专门为从文件描述符 1 (FILENO_STDOUT
) 读取和写入文件描述符 0 ( FILENO_STDIN
),p1
生成的信息将不会中继到 p2
。
您可以完全按照说明去做,并证明它不起作用。您可以创建一个以正统方式行事的可行解决方案,并证明它确实有效。
我还会对术语“管道命令”提出异议。在 macOS 上,有一个名为 pipe(8)
的实际命令:
NAME
pipe - Postfix delivery to external commandSYNOPSIS
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/
我知道这个问题可能已经被问过,但我检查了所有这些,我认为我的情况有所不同(请友善)。所以我有两个数据集,第一个是测试数据集,第二个是我保存在数据框中的预测(预测值,这就是没有数据列的原因)。我想合并两
在 .loc 方法的帮助下,我根据同一数据框中另一列中的值来识别 Panda 数据框中某一列中的值。 下面给出了代码片段供您引用: var1 = output_df['Player'].loc[out
当我在 Windows 中使用 WinSCP 通过 Ubuntu 连接到 VMware 时,它提示: The server rejected SFTP connection, but it lis
我正在开发一个使用 xml web 服务的 android 应用程序。在 wi-fi 网络中连接时工作正常,但在 3G 网络中连接时失败(未找到 http 404)。 这不仅仅发生在设备中。为了进行测
我有一个XIB包含我的控件的文件,加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。 文件的所有者被设置为 someClassController
我在本地计算机上管理 MySQL 数据库,并通过运行以下程序通过 C 连接到它: #include #include #include int main(int argc, char** arg
我不知道为什么每次有人访问我网站上的页面时,都会打开一个与数据库的新连接。最终我到达了大约 300 并收到错误并且页面不再加载。我认为它应该工作的方式是,我将 maxIdle 设置为 30,这意味着
希望清理 NMEA GPS 中的 .txt 文件。我当前的代码如下。 deletes = ['$GPGGA', '$GPGSA', '$GPGSV', '$PSRF156', ] searchquer
我有一个 URL、一个用户名和一个密码。我想在 C# .Net WinForms 中建立 VPN 连接。 你能告诉我从哪里开始吗?任何第三方 API? 代码示例将受到高度赞赏... 最佳答案 您可以像
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
我正在编写一个库,它不断检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。 https://github.com/muddassir235/connection_ch
我的操作系统:Centos 7 + CLOUDLINUX 7.7当我尝试从服务器登录Mysql时 [root@server3 ~]# Mysql -u root -h localhost -P 330
我收到错误:Puma 发现此错误:无法打开到本地主机的 TCP 连接:9200(连接被拒绝 - 连接(2)用于“本地主机”端口 9200)(Faraday::ConnectionFailed)在我的
请给我一些解决以下错误的方法。 这是一个聊天应用....代码和错误如下:: conversations_controller.rb def create if Conversation.bet
我想将两个单元格中的数据连接到一个单元格中。我还想只组合那些具有相同 ID 的单元格。 任务 ID 名称 4355.2 参与者 4355.2 领袖 4462.1 在线 4462.1 快速 4597.1
我经常需要连接 TSQL 中的字段... 使用“+”运算符时 TSQL 强制您处理的两个问题是 Data Type Precedence和 NULL 值。 使用数据类型优先级,问题是转换错误。 1)
有没有在 iPad 或 iPhone 应用程序中使用 Facebook 连接。 这个想法是登录这个应用程序,然后能够看到我的哪些 facebook 用户也在使用该应用程序及其功能。 最佳答案 是的。
我在连接或打印字符串时遇到了一个奇怪的问题。我有一个 char * ,可以将其设置为字符串文字的几个值之一。 char *myStrLiteral = NULL; ... if(blah) myS
对于以下数据 - let $x := "Yahooooo !!!! Select one number - " let $y := 1 2 3 4 5 6 7 我想得到
我正在看 UDEMY for perl 的培训视频,但是视频不清晰,看起来有错误。 培训展示了如何使用以下示例连接 2 个字符串: #!usr/bin/perl print $str = "Hi";
我是一名优秀的程序员,十分优秀!