对于execl,dup2()是否必需

人气:593 发布:2022-10-16 标签: ipc pipe c fork exec

问题描述

使用管道时是否需要将stdin替换为pipe结尾?

我有一个应用程序:-

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

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

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

如果您只能使用管道中的fd,当execl采用char *参数时,如何使用execl()传递整数fd

我很难弄清楚在执行execl()之后什么仍然是打开的,以及如何从新执行的进程访问该信息。

推荐答案

您可能正在尝试将数据馈送到系统上存在的子进程,但如果您也在写入子进程,则不需要使用dup()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 */
}

815