如何在execvp之后的子进程中使用文件描述符?

时间:2019-04-03 18:37:29

标签: c linux pipe fork execvp

我正在尝试使用fork()打开一个子进程,然后将execvp()插入另一个程序。 我还希望父进程和子进程使用管道相互通信。

这是父流程-

int pipefds[2];
pipe(pipefds); // In original code I check for errors...
int readerfd = pipefds[0];
int writerfd = pipefds[1];

if(pid == 0){
    // Child
    close(readerfd);
        execvp("./proc2",NULL);
}


在程序“ proc2”中,我尝试通过以下方式访问writerfd-

write(writerfd, msg, msg_len);

但是,我收到了编译时错误- “错误:未声明'writerfd'(此功能首次使用);”

那是为什么?我在堆栈溢出中读到“在调用exec时会保留打开文件描述符”。 link。如果是这样,我应该不能联系writerfd吗?

使用execvp后,如何在子进程上写入该文件描述符?正确的方法是什么?在哪里可以找到答案(我看过但没找到..)?

谢谢!

1 个答案:

答案 0 :(得分:4)

当您调用exec函数时,将保留打开的文件描述符。 保留的是用于存储它们的任何变量的名称。

您需要将文件描述符复制到另一个程序可以引用的已知文件描述符编号。由于子进程正在写入,因此您应该将管道的子端复制到文件描述符1,即stdout:

int pipefds[2];
pipe(pipefds);
int readerfd = pipefds[0];
int writerfd = pipefds[1];

if(pid == 0){
    // Child
        close(readerfd);
        dup2(writerfd, 1);
        execvp("./proc2",NULL);
}

然后proc2可以写入文件描述符1:

write(1, msg, msg_len);

或者,如果消息是字符串,则只需使用printf

printf("%s", msg);
fflush(stdout);