【发布时间】:2013-04-03 06:44:24
【问题描述】:
使用管道时是否需要将stdin 替换为pipe 结尾?
我有一个应用程序:-
- 创建管道,
- forks 一个子进程,然后
- execl() 新子进程中的新进程映像,
但我遇到了两个概念问题。
有必要用
dup()或dup2()代替stdin吗?使用管道中的fd显然会更容易。 (我几乎不需要了解这个)
1234563
我无法弄清楚在执行 execl() 后仍然打开的确切内容,以及如何从新执行的进程中访问该信息。
【问题讨论】:
-
我认为您觉得使用 dup() 和 dup2() 很复杂/很难。 Here is very good tutorial colorful and easy with diagram. 还有Other useful chapters
-
其实 dup() 和 dup2() 更容易其他也可能的方法是使用 fcntl() 或 ioctl() 函数但并不比 dup.() 更简单
-
@GrijeshChauhan 但是,需要 dup 吗?我猜有必要,我的意思是子进程打开文件描述符在执行 execl 时是否保持打开状态?我认为如果是新的,exec 家族会清除进程映像。如果没有必要,我不确定如何通过 char *arg 传递管道的文件描述符(它是一个 int)。
-
相信你正在用execl系列函数替换标准命令。这些函数默认写入标准输出也从标准输入获取输入。要与该进程通信,您必须将管道建立为 IPC,并且必须使用 dup() 显式更改输入/输出流。但是假设如果您的子进程不与标准输入/输出交互,那么就没有必要重定向标准输入/标准输出。 (记住 stdin/stdout 是
FILE*不是描述符) -
回答第二个问题:假设您想将子进程输出重定向到父进程打开的其他文件。然后您可以将打开文件的
fd作为参数从父进程传递给子进程。并按照相同的步骤使用 dup() 重定向到该文件