1

使用管道时 是否需要更换stdin末端?pipe

我有一个应用程序:-

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

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

  1. 是否需要使用dup()dup2()更换stdin?显然,只使用fd管道会更容易。(我对此几乎不需要了解

  2. 如果你可以只使用管道 fd中的,你如何 在 execl 接受参数时传递一个整数? fdexecl()char *

我无法弄清楚在执行 execl() 后仍然打开的内容,以及如何从新执行的进程中访问该信息。

4

2 回答 2

3

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

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

不; 您没有义务使用dup2(),但这样做通常更容易。您可以关闭标准输出,然后使用 plaindup()而不是dup2().

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

于 2013-04-11T13:14:53.913 回答
2

您可能正在尝试将数据提供给系统上存在的子进程,但如果您也在编写子进程,那么您不需要使用dup()and 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);
}

并在客户端代码中:

int main(int argc, char** argv)
{
    int fd = strtod(argv[1], NULL, 10);
    /* Read from fd */
}
于 2013-04-11T13:22:37.697 回答