问题标签 [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 投票
1 回答
10637 浏览

python - python中的dup、dup2、tmpfile和stdout

这是here的后续问题。


我想去的地方

我希望能够暂时将标准输出重定向到一个临时文件,而 python 仍然能够打印到标准输出。这将涉及以下步骤:

  1. 创建 stdout ( new)的副本
  2. 创建临时文件 ( tmp)
  3. 将标准输出重定向到tmp
  4. 告诉 pythonnew用作标准输出
  5. 重定向tmp到“真正的”标准输出
  6. 告诉 python 再次使用“真正的”标准输出
  7. 阅读并关闭tmp

执行

我尝试通过以下方式实现上述内容:

我想在这里休息一下来总结一下。
直到此处的控制台输出应为:

sil应该是这样的:['0.3\n']. 所以直到这里,一切都像魅力一样运作。但是,如果我像这样再次重做上面的脚本:

发生错误,输出如下所示:

sil读取:['0.3\n', '']

换句话说:第二个Func("1.3", True)无法写入临时文件。

问题

  1. 首先,我想知道为什么我的脚本不能像我希望的那样工作。意思是,为什么只能在脚本的前半部分写入临时文件?
  2. 我对 and 的用法还是有点dup疑惑dup2。虽然我认为我了解将标准输出重定向到临时文件的工作原理,但我现在完全知道为什么os.dup2(new, 1)要做它正在做的事情。也许答案可以详细说明我的脚本中的所有dupdup2s 在做什么^^
0 投票
1 回答
10728 浏览

unix - 你如何一起使用 dup2 和 fork ?

我正在学习操作系统课程,当你有分叉时,我很难用 dup2 重定向输入。我编写了这个小程序来尝试理解它,但我没有成功地将孙子的输出传递给孩子。我正在尝试模仿 unix 命令: ps -A | 厕所-l。我是 Unix 新手,但我相信这应该计算我得到的正在运行的进程列表的行数。所以我的输出应该是一个数字。

我在上面的代码中没有它,但这是我对事情应该如何进行的猜测:

  • 我们需要重定向命令 ps -A 的标准输出(通常会打印到屏幕上,对吗?),以便 wc -l 命令可以使用它来计算行数。
  • 可以使用 dup2 重定向此标准输出,例如 dup2(?, 1),这意味着将标准输出重定向到 ?。然后你关闭?

问题:我将它重定向到哪里?我知道它应该是文件描述符之一,但是应该将它重定向到哪里以便 wc 可以处理它?

  • wc 以某种方式接收标准输出。

问题: wc 如何接收输出?通过 execlp 参数?或者操作系统是否检查文件描述符之一?

  • 执行 wc -l。

其中哪一个是关闭并保持打开以便 wc 接收和处理 ps 的输出?我一直认为这需要倒过来考虑,因为 ps 需要将其输出提供给 wc ......但这似乎没有意义,因为孩子和孙子都是并行处理的。

白日梦

0 投票
1 回答
4078 浏览

c - 在C中关闭管道,dup2,文件描述符?

我正在运行一个做管道的程序。我要运行的命令是 ls | 猫。

当我运行代码时,命令 ls | cat 运行良好,只是 cat 没有结束(即管道没有关闭,只是等在那里什么都不做)。我认为这是因为我没有关闭流或其他东西,但我对 C/IO 不够熟悉,无法确定。我这样做对吗?

运行这个函数的代码就像

编辑:你说得对,致命错误,我在争论上打错了

thxs,看起来我只需要关闭父级中的管道 [1]

0 投票
1 回答
10229 浏览

c - 如何正确使用 dup2/close 连接这三个进程?

我正在尝试正确连接三个进程以允许它们之间的进程间通信。我有一个进程,scanner,它获取父级的 STDIN,然后处理流中的单词。如果一个字长是奇数,它将它发送到一个进程,如果它是偶数,它将它发送到另一个进程。这些进程应该通过 STDIN(我假设)接收这些单词,然后通过 STDOUT 将一些信息输出回扫描仪进程。偶数/奇数的 STDOUT 应该重定向到扫描仪,然后扫描仪将读取(使用读取)然后输出/处理单词。这是一项学术练习,而不是实践练习。这是它的图片:

管道设置

这是我的代码目前的样子。问题是我不确定要复制什么以及要关闭什么。一旦我弄清楚了,我应该好好去!任何意见,将不胜感激。

文件描述符:

代码:

0 投票
1 回答
2170 浏览

c - 使用 dup2 使 C 程序执行诸如“ls /bin |”之类的命令时遇到问题 grep | grep b'

我在使用 dup2 使 ac 程序执行诸如ls /bin | grep grep | grep b. 当我注释掉第三个命令和关联的管道时,它执行得ls /bin | grep grep很好,但是使用最后一个命令它会立即返回。此外,当我输入“ps”时,进程仍在运行。我认为这是由于我关闭管道的方式。我的代码如下:

0 投票
1 回答
1403 浏览

c - 使用 dup2 重定向标准输入和标准输出的未定义错误

我想使用管道重定向子进程的标准输入和标准输出。

目前我有以下代码:

但是,此代码不起作用,因为我不断收到

dup2 pipeOut:未定义错误:0

它最终陷入僵局。
我知道代码停止是因为父母一直在等待孩子的回答(永远不会到达),而孩子也一直在等待永远不会到达的输入。

我不明白为什么我不断收到这个错误。难道我做错了什么?

我正在开发 MacOS Lion 10.7.2 和 Xcode 4.2.1。


更新:在亚当罗森菲尔德的回答之后,我更正了我的 if 语句。但是,正如我所说,代码仍然停止(我只能阅读孩子打印的第一件事,Child: Parent Message而没有其他内容)。

知道为什么会这样吗?

0 投票
1 回答
2940 浏览

c - 通过 C 中的 pipe/dup2 向子进程发送命令

我正在尝试在我的树莓派上为 omxplayer 编写远程控制程序

我可以让 omxplayer 在子进程中正常运行,但我似乎无法让管道正常工作以实际向子进程发送命令。

当我使用 top 进行测试并运行程序时,我可以看到 top 输出出现在终端窗口中,并且我可以在窗口中看到 q 命令,但它看起来像是进入父进程而不是子进程。我是在管道上做错了什么,还是无法向生成的子进程发送命令?

我尝试将子 dup2 语句更改为从管道复制到标准输入

但随后 top 无法以失败的 tty get 消息开始

0 投票
1 回答
172 浏览

c - 为什么 dup2 可以在这里工作?

我从 APUE 得到了这个代码片段,

这会将所有输出、stderr 和 stdout 重定向到远程套接字,该套接字可通过 clfd 写入。

但那怎么行呢?您将两个 FD 重定向到一个。

0 投票
1 回答
163 浏览

linux - 使用 dup2 复制手动管道时出现无法解释的行为

我有两组代码都试图执行类似ls|grep pip 一个有效的和一个无效的。

工作代码创建了 2 个子进程,每个子进程使用一个子进程来执行一个命令,另一个简单地尝试通过创建一个子进程来执行此操作。即在说孩子和父母中的grep中执行ls。这似乎不起作用。而且我似乎也没有任何错误。

有人可以告诉我问题是什么吗?它为什么存在?

不工作:

以下是代码:

在职的:

0 投票
2 回答
2111 浏览

fork - dup2 阻止 printf,但不阻止 fprintf?

因此,我为我的操作系统类分配了一项任务,其中我要创建一个与管道连接的进程环,以便在它们之间传递消息。我找到了一些示例代码,我希望根据我的需要调整(或至少理解)这些代码。示例代码(稍作修改)是:

输出:

当我给 2 作为 argv[1]

所以,我想知道,为什么 dup2 部分会阻止 printf() 执行?如果我什至不能打印某些东西,我不确定我是否可以正确传递消息。另外,为什么 fprintf() 已经在那里工作了,但我不会放在那里?

编辑:我会把这个带给我的教授/助教,但他们都在城外,从现在到截止日期之前都无法到达......