问题标签 [dup2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
31835 浏览

c - 在 C 中使用 fork()、pipe()、dup2() 和 exec() 时遇到问题

这是我的代码:

(代码已更新以反映他下面两个答案提出的更改,它仍然无法正常工作......)

这是失败的测试用例:

问题是我应该在那之后返回我的shell,我应该看到“Shell>”等待更多输入。您还可以注意到,您没有看到类似于“[4804] TERMINATED (Status: 0)”(但 pid 不同)的消息,这意味着第二个进程没有终止。

我认为它与 grep 有关,因为它有效:

您可以轻松地看到两个“终止”消息...

那么,我的代码有什么问题?

0 投票
5 回答
10018 浏览

c - C 中的这种多管道代码有意义吗?

几天来我已经提出了一个关于这个的问题。我的解决方案与已接受答案中建议的内容一致。但是,我的一个朋友提出了以下解决方案:

请注意,代码已经更新了几次(检查编辑修订)以反映以下答案中的建议。如果你打算给出一个新的答案,请记住这个新代码,而不是有很多问题的旧代码。

这会通过 bash 中的管道模拟一系列命令,例如: cmd1 | 命令2 | ... | cmd_n。我说“模拟”,因为如您所见,命令实际上是从参数中读取的。只是为了节省时间编写一个简单的 shell 提示符......

当然,还有一些问题需要修复和添加,比如错误处理,但这不是重点。我想我有点得到代码,但它仍然让我很困惑这整个事情是如何工作的。

我是否遗漏了某些东西,或者这确实有效,并且它是解决问题的好而干净的解决方案?如果没有,谁能指出这段代码存在的关键问题?

0 投票
2 回答
786 浏览

c - 多个打开文件同时读取

我想使用 dup2 从输入文件中读取并将其重定向到 exec 函数的输入。但我的问题是我有三个正在运行的进程,它们都必须打开相同的输入文件,但它们做不同的工作。在这种情况下你有什么建议?我不知道是否可以使用“cat data.txt”来为其他三个进程提供输入,但我不知道如何做到这一点。

0 投票
1 回答
134 浏览

c - 送线其他多线程

我看到使用 fork 在两个进程之间打开管道很容易,但是我们如何将打开的管道传递给线程。假设我们需要“可能通过多个线程”将 PROGRAM A 传递给 PROGRAM B,PROGRAM B 将其输出发送到 PROGRAM C

编辑:我在修改代码后又来了,变得更容易阅读。

0 投票
2 回答
485 浏览

c - 在 dup2 之后,流仍然包含旧内容?

所以如果我这样做:

我在这一点上发现.. stdin 仍然包含我没有使用的两行。这是为什么?因为无论您重定向多少次,都只有一个缓冲区?如何摆脱剩下的两行,但当我想回到它时仍然记得我在 somefile 流中的位置?

0 投票
2 回答
1546 浏览

c - C: 被 dup2() 卡住了 :-(

我准备了一个使用管道模拟 shell (cmd) 接口的程序。该程序有两个版本: 1. 使用一个管道(使用一个管道从父级到子级通信) 2. 使用双级管道(使用两个管道从父级到子级和从子级到父级进行通信)。

因此,第一个程序提供了所需的界面并按照我的意愿工作,但我无法在第二个程序中达到相同的结果(界面)(使用 dup2() 和类似的)。

所以,我转达你的帮助,并将这两个代码放在下面。

BS:您可以使用以下命令以相同的方式编译和尝试这两个程序:

$ gcc prog1.c -o prog1

接下来让我们运行:

$ ./prog1

接下来让我们运行新终端并尝试将一些数据写入 input.txt:

$ echo pwd > input.txt

然后在第一个终端观看结果。

(这对于第一个程序来说工作正常,但我需要在第二个程序中使用相同的界面来让它工作)

第一个程序的代码(工作正常):

第二个程序的代码(需要更正一点):

0 投票
1 回答
663 浏览

c - dup2的问题

将 Ben Voigt 的答案合并到代码中后,它似乎可以工作

原始问题:

我正在尝试使用 dup2 来:

  1. 将“ls -al”的输出作为输入传递给“grep foo”,
  2. 其输出成为“grep bar”的输入,
  3. 最终输出到标准输出。

最终输出为(空白),文件“in”为(空白),文件“out”的输出为“ls -al”。

任何想法可能会发生什么?

0 投票
2 回答
39364 浏览

c - 使用 dup2 进行管道

如何使用 dup2 执行以下命令?

0 投票
6 回答
16379 浏览

c - popen() 可以制作像 pipe() + fork() 这样的双向管道吗?

我正在用 C++(主要是 C)在模拟文件系统上实现管道。它需要在主机外壳中运行命令,但在模拟文件系统上执行管道本身。

我可以通过 、 和 系统调用来实现这一点pipe()fork()system()我更喜欢使用popen()(它处理创建管道、分叉进程以及将命令传递给 shell)。这可能是不可能的,因为(我认为)我需要能够从管道的父进程写入,在子进程端读取,从子进程写回输出,最后从父进程读取该输出。我系统上的手册页popen()说双向管道是可能的,但我的代码需要在旧版本仅支持单向管道的系统上运行。

通过上面的单独调用,我可以打开/关闭管道来实现这一点。这可能popen()吗?

举一个简单的例子,要运行ls -l | grep .txt | grep cmds我需要:

  • 打开一个管道和进程ls -l在主机上运行;读回它的输出
  • 通过管道将输出ls -l返回到我的模拟器
  • 打开管道和进程以grep .txt在主机上的管道输出上运行ls -l
  • 通过管道将其输出回模拟器(卡在这里)
  • 打开管道和进程以grep cmds在主机上的管道输出上运行grep .txt
  • 通过管道将其输出回模拟器并打印出来

男人弹出

从 Mac OS X:

popen()函数通过创建双向管道、分叉和​​调用 shell 来“打开”一个进程。父进程中先前popen() 调用打开的任何流都在新的子进程中关闭。从历史上看,popen()是用单向管道实现的;因此,许多实现popen()只允许 mode 参数指定读取或写入,而不是两者。因为 popen()现在使用双向管道实现,所以 mode 参数可能会请求双向数据流。mode 参数是一个指向以 null 结尾的字符串的指针,该字符串必须是 'r' 用于读取,'w' 用于写入,或 'r+' 用于读取和写入。

0 投票
1 回答
841 浏览

c++ - 麻烦管道三个命令“dmesg|sort|more”c++

我已经成功地将一个命令的输出通过管道传输到另一个命令的输入,然后将第二个命令的输出显示到屏幕上。

我想用三个连续的命令来做到这一点。(实际上最终我想用在运行时传递给程序的 N 个命令来做到这一点。

这是我将三个命令连接在一起的尝试。

更新:我更新了我的问题以反映我最近的尝试。

为简单起见,我对所有值进行了硬编码。该程序显示应该是“dmesg|more”的输出,但不执行排序部分,然后冻结。我在左下角看到了 dmesg 的乞求和更多内容,但我再也看不到了。

有任何想法吗?