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

c - Is it possible to redirect stdout to two places in C?

I've been stuck on this for a while now, is it possible to redirect stdout to two different places? I am writing my own shell for practice, and it can currently run commands like ps aux | wc -l or ps aux | wc -l > output.file. However, when I try to run ps aux > file.out | wc -l, the second command does not receive the input from the first.

In the last example, the first command would be run in a child process that would output to one end of the pipe. The logic is similar to what follows:

0 投票
1 回答
326 浏览

c - 为什么 setitimer 和 dup2 在 execvp 之后为子进程工作?

首先让我说这里有很多问题。

我的论文的一项任务要求我编写一个执行子程序的程序,如果它的运行时间(不是 wall-time 而是 user+sys )大于特定值或者它的 RAM 消耗大于另一个,则将其杀死指定值。

虽然我还没有弄清楚 RAM 部分。我用 setitmer 和 ITIMER_PROF 信号来消磨时间。(因为 ITIMER_PROF 收集实际的 CPU 使用情况,而不是设置一个起始时间点,然后计算 x 时间量)

我使用 setitimer 的原因是因为我需要的精度低于秒精度。(EG 在 1.75 秒(1750000微秒)后终止进程。setrlimit 方法只有一秒。

问题1为什么在父进程中设置了ITIME_PROF的setitimer不起作用孩子的CPU/系统调用不是由它收集的吗?

问题 2为什么会这样!?execvp 不会覆盖所有函数(timeout_sigprof、main 和任何其他函数)吗?并且不能有人潜在地捕获子程序中的信号并取代原始功能吗?

问题 3为什么放在这里的 dup2 真的可以工作,让孩子的输入/输出被重定向?

这是我编写的代码,它仅在程序运行 X 时间( x = 500ms )后才会杀死程序。

任何帮助/解释将不胜感激!

谢谢大家,

前任

0 投票
2 回答
1871 浏览

c++ - 为什么我不能通过管道输出两个 execl 调用?

可能的重复:

最近三天,我一直在尝试使用 dup/dup2 和 fork 在 Linux 中学习管道。我想我已经掌握了窍门,但是当我从子进程调用两个不同的程序时,似乎我只捕获了第一个调用的输出。我不明白为什么会这样和/或我做错了什么。这是我的首要问题。

编辑:我认为一个可能的解决方案是分叉另一个孩子并使用 dup2 设置管道,但我更想知道为什么下面的代码不起作用。我的意思是,我希望从第一个 execl 调用中捕获 stderr,从第二个调用中捕获 stdout。这似乎没有发生。

我的第二个问题是我是否正确打开和关闭管道。如果没有,我想知道我需要添加/删除/更改什么。

这是我的代码:

当我运行它时,我得到以下输出:

“outerr”二进制文件(上面注释掉)的源代码很简单:

当我调用“outerr”而不是 ls 或“foo”时,我会得到以下输出,这是我所期望的:

0 投票
1 回答
832 浏览

c - 在子进程中调用 dup2 和 execvp 后,父进程中的文件描述符表会发生什么变化?

我正在编写一个简单的 shell 程序,但不确定在 dup2() 和 execvp 之后文件描述符表会发生什么。所以我有一个父进程等待子进程结束(waitpid)但是当它循环回来等待下一个用户输入时,我在子进程中使用 dup2 修改的文件描述符表为什么不会保留在父进程中?是因为 execvp 将文件描述符表重置回原来的吗?

编辑:我想通了。fork 函数实际上制作了程序映像的单独副本,包括文件描述符表,因此父进程的 fd 表不受影响。

0 投票
0 回答
321 浏览

c - 将标准输出重定向到文件并每隔一行插入字符串

我使用 C 编写程序,其中使用 POPEN 执行系统命令。将每个命令的输出写入文件。我希望能够写入同一个文件并对命令的输出进行编号。

这是我打算做的输出。

假设我要运行的命令是..

1) ls 2) bash -版本

所以我想要的输出看起来像这样..

这是我制作的代码:

}

我能够将标准输出的输出重定向到一个文件,我使用 dup2 来实现这一点。然后知道 dup2 将 stdout 重定向到文件,我使用 printf,打印我想在文件中插入的字符串(我期望 printf 中的字符串将被重定向到同一个文件并将其插入到我想要的位置但它没有。)

这就是我得到的.. 是的,输出被重定向到文件以及 printf 中的字符串。但是,正如您在下面看到的,它没有按照我想要的方式格式化......

我将如何做到这一点?谢谢!

0 投票
1 回答
689 浏览

c - 不能 dup2 将管道的结尾写入标准输出

我遇到了 dup2() 和 pipe() 的问题。

当我尝试将管道的写入端复制到 STDOUT_FILENO 时,我收到了 EBADF。

我中断dup2(pout[1], STDOUT_FILENO)了 gdb 并检查了/proc/$pid/fdinfo/$pout[1]是否有 O_WRONLY 标志。这个麻烦快把我逼疯了。

笔记:

  • 在函数开始时,我将所有管道初始化为-1。
  • 这个问题只发生在 x86 上,在我的 x86_64 工作站上一切正常。
  • 操作系统是 Gentoo GNU/Linux(x86 和 x86_64 机器)

输出如下:

提前感谢您的帮助。

0 投票
1 回答
913 浏览

c - 使用 exec 程序从父级读写多个子级

我对 C 很陌生,不确定如何继续。

使用此代码,我试图创建多个子进程,这些子进程会将它们的标准输出发送到它们的父标准输入,并且可以使用数组中指针位置的 fdprintf 写入它们的标准输入。

当使用读取标准输入并打印到其标准输出(应通过管道返回)的基本程序执行时,该代码似乎不起作用。(在主代码的不同部分中,我 fprintf 到管道开始的位置,然后读取 stdin 等待应该写回的内容)。

该命令只是运行子进程,它还获取子进程的数量和从 A 到 D 的 id。*pipes[] 是 numChildren*2 乘以 2(因此沿着其子 1 读取管道,child1 写入管道,child2 读取,child2 写等。请提前帮助和感谢。

0 投票
2 回答
201 浏览

c++ - 消失的子进程

我有这个方法:

我仅出于调试目的添加了打印语句。但是,当此方法运行时,这就是打印的内容。

进程 1454 是第一个分叉的进程,它在消息创建后立即打印该消息。但是,它从不打印来自 switch 语句的任何消息,并且从不执​​行指定的程序(在本例中为 cat)。该进程不会像僵尸一样徘徊,它只是消失了。结果,第二个子进程挂断了,实际上什么也没做。

(另外,补充一下,我知道我还没有添加所有适当的错误处理,功能还没有完成)。

0 投票
2 回答
5160 浏览

c - Fork 和 dup2 - 子进程未终止 - 文件描述符问题?

我正在为家庭作业编写自己的外壳,并且遇到了问题。

cat scores | grep 100我的 shell 程序从控制台获取输入并按预期打印输出,但grep命令不会终止,我可以看到它从ps命令无限运行。


编辑 - 关闭 fds 时出错。现在 grep 命令未执行,控制台输出为 -

grep:(标准输入):错误的文件描述符


我正在从控制台读取命令数量并创建必要的管道并将它们存储在二维中int array fd[][],然后再分叉第一个进程。

fd[0][0]将包含第一个管道的读取端,fd[0][1]并将包含第一个管道的写入端。fd[1][0]将包含第二个管道的读取端,fd[1][1]并将包含第二个管道的写入端,依此类推。

每个新进程将stdin其管道的读取端复制到前一个进程,并将stdout其管道的写入端复制到下一个进程。

以下是我的功能:

  • args将包含命令的参数。
  • count是我需要创建的命令数。
  • pos是命令在输入中的位置

我无法弄清楚问题所在。在此之前,我对硬编码值使用了相同的方法并且它正在工作。

我对 / 的理解/实现缺少什么dup2fork为什么命令无限等待?

任何输入都会有很大帮助。这两天被这个问题困扰!


编辑:close_fds() 函数如下 - 对于任何进程,我正在关闭链接进程的两个管道。

0 投票
1 回答
47 浏览

c - 进程通信:发送*命令,为什么循环

我正在尝试启动一个子进程并通过管道向他发送命令。我想我错过了一个我不知道的概念。

第一个命令发送成功,另一个失败,它给了我一个无限循环。我不明白为什么。

父.c

孩子.c

这是输出:

-bash-4.1$ ./parent 子进程:[61983]


输入命令:[allo

]

输入命令:!

[]

输入命令:^C

-bash-4.1$

我结束了这个过程,否则在此之后它会给我一个无限循环。

我正在阅读类似的问题,但我找不到答案。如果可能,请尽可能简单地回答。

谢谢。

ps,是的..这是一项学校作业。我的目标是将相同的命令发送给多个孩子。但我试图先走出这一步。