c - 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 的调用中被保留。” 链接。如果是这样,我不应该能够联系到 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);
推荐阅读
- python - 如何在类方法中就地更改列表元素
- yii2 - 如何在 yii2 gii 生成的 crud 中添加自定义新字段
- python - 具有柱式变压器和管道的 ML 模型的参数调整
- html - 制作按钮使用动画来取消悬停鼠标
- php - PHP session_start() 和 session_abort() 的行为看起来有些出乎意料
- html - 为什么包裹在锚标签中时图像尺寸会缩小?
- javascript - 从 javascript 录制和上传音频
- flutter - 如何在颤动中用平移、倾斜和缩放值填充 Matrix4?
- javascript - 搜索嵌套的对象数组并返回所有匹配项的完整路径
- xcode - 项目构建成功但预览时出现很多错误