是execl所必需的dup2()

时间:2013-04-11 07:01:20

标签: c exec fork ipc pipe

使用管道时是否有必要将stdin替换为pipe

我有一个应用程序: -

  • 创建管道
  • 分叉子进程,然后
  • execl()新子进程中的新进程映像

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

  1. 是否有必要使用dup()dup2()来替换stdin?显然,从管道中使用fd会更容易。 (我对此

  2. 如果您可以使用管道中的fd,当execl接受fd个参数时,如何使用execl()传递整数char *

  3. 我无法确定execl()执行后究竟剩下什么,以及如何从新执行的进程中访问该信息。

2 个答案:

答案 0 :(得分:3)

这取决于您正在运行的命令。但是,许多Unix命令从标准输入读取并写入标准输出,因此如果未设置管道以使写入结束是一个命令的输出而读取结束是下一个命令的输入,则不会发生任何事情(或更准确地说,程序从输入来自的地方读取,或写入不会被读取的地方,或者等待您在终端输入输入,或者不能按预期工作)。

如果您的管道位于文件描述符3和4上,那么您执行的命令必须知道从3开始读取并写入4.您可以使用shell处理它,但与使用{{{}相比,这样做是适度的怪诞过度杀伤1}}。

没有;您没有义务使用dup2(),但通常更容易使用dup2()。您可以关闭标准输出,然后使用普通dup()代替dup2()

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

答案 1 :(得分:2)

您可能正在尝试将数据提供给系统中存在的子进程,但是您也在编写子进程,那么您不需要使用dup()和{{1} }。

stdin保持父进程中所有打开的文件描述符都打开,以便您可以:

execl()

并在客户代码中:

int fd[2];
pipe(fd);
if (fork() == 0)
{
    char tmp[20];
    close(fd[1]);
    snprintf(tmp, sizeof(tmp), "%d", fd[0]);
    execl("client", tmp, NULL);
    exit(1);
}