问题标签 [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 回答
2041 浏览

c - Linux/C:将管道重定向到 STDIN/STDOUT

我在用 C 程序模拟 shell 脚本“env | grep HOME”时遇到了麻烦。我发现注释掉第 29 行解决了这个问题,但我不确定为什么!我在另一个问题上读到,这是因为 dup2() 正在关闭孩子的 fd,但手册页没有表明这一点。谁能给我一个明确的理由并帮助我理解这种行为?谢谢!

0 投票
2 回答
137 浏览

c - 我觉得好像 dup2() 是多余的

我的理解是,如果我有两个文件描述符

这两个功能:

和 -

实际上,将完成相同的任务。

dup2() 有返回值有什么意义?如果 dup2() 的返回值只是文件描述符,为什么要使用 dup2 如果你可以说:

很明显,我在这里缺少一些东西。

顺便说一句:请不要告诉我阅读手册页,或者我不拥有的书。那没有帮助。

0 投票
1 回答
790 浏览

c - 从 execvp 将标准输出写入文件

为什么 execvp 没有写入重定向的 STDOUT?我尝试在这个块中使用 printf() 作为测试,它准确地写入了它应该写入的位置,即我将 STDOUT 重定向到的文件中。

编辑:我更改了代码,并添加了 makesubcommand 的实现,并添加了一些调试消息。

继承人 makesubcommand(4):

这是一个测试运行:

0 投票
1 回答
130 浏览

c - Posix C 管道延迟

我遇到了一个棘手的问题:

假设我有一个程序,我们把它命名为 HelloProgram 代码很简单:

而且我还有一个程序,我们把它命名为Redirector,代码有​​点复杂:

那里没有说明一些错误检查,这是为了使代码更简单。我仍然无法理解这件事:

当 Redirector 与 HelloProgram 一起使用以重定向其输出时,所有“Hello”文本仅在 3 * 10(== 迭代次数)== 30 秒后才会显示到控制台屏幕,

这他妈到底是什么?我想它会是某种并行的,所以我每 3 秒后在控制台上显示每个“Hello”字符串。

请帮帮我。

0 投票
2 回答
178 浏览

c - 简单的 dup2 函数在 ubuntu 上不起作用

有人可以告诉我为什么 dup2 的这个基本实现不起作用。当我运行它时,输出不会被重定向,而是简单地打印在标准输出上。

0 投票
0 回答
336 浏览

c - dup2 - 创建管道程序

我想编写一个程序,最终将复制此功能

程序1 | 程序 | 程序X

所以我想将programX的输出重定向到programX+1的输入。

为了简单起见,我只想从两个程序和一个管道开始。

在伪代码中,我的方法如下所示:

到目前为止一切顺利,这是我目前拥有的:

这几乎实现了我想要做的事情,但是 child2 中的输出似乎再次写入管道并导致写入自己的管道。我认为,我在这里可能完全错了,(尽管在 child2 中关闭了写入端)它通过 printf 写入自己的管道(因为我将 STDOUT 重定向到管道的写入端)并再次读取。所以输出看起来像这样

当我使用参数运行程序whosort

myProg 谁排序

我得到以下输出:

缓冲区 = 缓冲区 = martine****** 控制台 4 月 24 日 12:59

编辑:

如何在 execvp("sort", argsArr); 中设置排序命令的输入 ? sort 通常需要一个文件名,那么我该怎么做呢?

0 投票
2 回答
1909 浏览

c - 使用 dup2 时的竞争条件

这个dup2系统调用的手册页说:

EBUSY(仅限 Linux)这可能由 dup2() 或 dup3() 在与 open(2) 和 dup() 的竞争条件下返回。

dup2它谈论什么竞争条件,如果EBUSY出现错误我该怎么办?我应该重试EINTR吗?

0 投票
1 回答
3037 浏览

c - 带有多个子进程的C读写

从 C 中的父进程,我正在运行 3 个子进程,每个子进程都执行一个程序。

  • 程序 1 获取标准输入(用户输入)并将其打印到标准输出。
  • 程序 2 获取标准输入(应该来自程序 1),对其进行修改并打印到标准输出。
  • 程序 3 获取标准输入(应该来自程序 2),修改它并打印到标准输出

我得到程序 3 的输出,但程序 2 的修改没有显示。

以下是父级的相关代码:

这些程序使用 fgets 和 printf 进行读/写。

我检查了以前的问题,但我无法找出我做错了什么。有任何想法吗?

0 投票
1 回答
21703 浏览

c - dup2() 在 C 中做了什么

我在手册页中查找了它,但我仍然不明白...

假设你有dup2(f1,0)。是否使用标准输入切换filedesc.1然后锁定标准输入?

0 投票
1 回答
2325 浏览

c - 使用 dup2 将 stdout/stderr 重定向到同一文件时出现问题

dup2在尝试将两者都重定向stdoutstderr同一个输出文件时遇到了一些麻烦。

我正在使用这个解释性代码示例:(gcc 4.8.2,Ubuntu 14.04)

USE2FILES 宏应该在使用 2 个文件描述符(到同一个文件)之间切换,它们分别被复制到stdoutstderr或 1 个文件描述符被复制到stdoutstderr.

我的印象是使用 2 个不同的文件描述符进行重定向应该可以工作。但是,使用 USE2FILES 运行这段代码会在以下输出test.out

如果我然后禁用 USE2FILES 我得到:

似乎在第一种情况下没有输出stderr通过。这种行为是否可以预料(我错过了什么)?

编辑:接受克里斯多德的回答后:这确实是一个糟糕的例子。将序列更改为fprintf如下所示:

得到我这个test.out输出:

显示得很清楚stdoutstderr并且正在与他们在同一个文件上的写入竞争。