c - execl 是否需要 dup2()

标签 c exec fork ipc pipe

使用管道时是否需要将stdin换成pipe端?

我有一个应用程序:-

  • 创建一个管道,
  • fork 一个子进程,然后
  • execl() 在新的子进程中执行一个新的进程镜像,

但我遇到了两个概念性问题。

  1. 是否需要用dup()dup2()来代替stdin?显然只使用管道中的 fd 会更容易。 (我不需要对此有什么了解)

  2. 如果您只能使用管道中的 fd,那么当execl 接受 char * 参数?

我无法弄清楚在执行 execl() 之后究竟还有哪些内容处于打开状态,以及如何从新执行的进程中访问该信息。

最佳答案

这取决于您正在运行的命令。然而,许多 Unix 命令从标准输入读取并写入标准输出,所以如果管道没有设置为写入端是一个命令的输出而读取端是下一个命令的输入,则什么也不会发生(或,更准确地说,程序从没有输入的地方读取,或者写入不会被读取的地方,或者挂起等待您在终端键入输入,或者无法按预期工作)。

如果您的管道位于文件描述符 3 和 4 上,则您执行的命令必须知道从 3 读取并写入 4。您可以使用 shell 处理它,但与使用 dup2().

没有;您不是必须使用 dup2(),但这样做通常更容易。您可以关闭标准输出,然后使用普通的 dup() 而不是 dup2()

如果您对管道使用 dup2(),请不要忘记关闭原始文件描述符的两者

关于c - execl 是否需要 dup2(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15942560/

相关文章:

c - 在结构体中定义指针

c - 如何解析DW_OP_call_frame_cfa?

php shell_exec 权限被拒绝

php - 在 CentOS7 上从 PHP 写入文件(通过执行 git 命令)

c - 将fork的返回值保存在C中的变量中

C fork 和管道从文件中添加数字

process - 为什么 sudo 调用 fork() 和 exec() 而不仅仅是 exec()?

c - 字符串操作和 rot-13

c - 即使整个代码没有划分,hackerrank 也会出现运行时错误

c++ - 产卵 child 和执行 - 未定义的行为