execvp后如何在子进程中使用文件描述符?
how to use a file descriptor in a child process after 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);
但是,我得到了一个编译时错误 -
"error: ‘writerfd’ undeclared (first use in this function);"
这是为什么呢?我在这里读到堆栈溢出 "Open file descriptors are preserved across a call to exec." link。如果是这样,我不应该能够联系到 writerfd 吗?
如何在使用 execvp 后写入子进程的文件描述符?执行此操作的正确方法是什么?我在哪里可以找到答案(我看过但没有找到..)?
谢谢!
调用 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);
我正在尝试使用 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);
但是,我得到了一个编译时错误 - "error: ‘writerfd’ undeclared (first use in this function);"
这是为什么呢?我在这里读到堆栈溢出 "Open file descriptors are preserved across a call to exec." link。如果是这样,我不应该能够联系到 writerfd 吗?
如何在使用 execvp 后写入子进程的文件描述符?执行此操作的正确方法是什么?我在哪里可以找到答案(我看过但没有找到..)?
谢谢!
调用 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);