【发布时间】:2021-12-15 05:33:47
【问题描述】:
如何获得由 exec() 运行的程序的输出。假设我有这个代码:
int main(int argc, char ** argv) {
int fid = fork();
if(fid == 0) {
execlp("ls", "ls", NULL);
}
wait();
return 0;
}
父进程如何获取ls命令的输出?
【问题讨论】:
如何获得由 exec() 运行的程序的输出。假设我有这个代码:
int main(int argc, char ** argv) {
int fid = fork();
if(fid == 0) {
execlp("ls", "ls", NULL);
}
wait();
return 0;
}
父进程如何获取ls命令的输出?
【问题讨论】:
exec 系列函数完全替代了当前进程。但是,除非它们标记为 close-on-exec,否则它们不会关闭文件描述符。因此,执行此操作的典型方法是创建一个管道,其中读取端属于父级,写入端属于子级。
这看起来像这样(省略了错误检查并且显然效率低下):
#include <stdint.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char ** argv) {
int pipefd[2];
int status;
uint8_t buf[256];
pipe(pipefd);
int fid = fork();
if(fid == 0) {
close(pipefd[0]);
dup2(pipefd[1], 1);
close(pipefd[1]);
execlp("ls", "ls", NULL);
}
close(pipefd[1]);
while (read(pipefd[0], buf, 1) > 0)
write(1, buf, 1);
wait(&status);
return 0;
}
请注意,要将管道文件描述符附加到标准输出(FD 1),您需要使用dup2。您还需要关闭不使用的管道末端,否则您可能永远不会到达文件末尾。
如果您对退出状态感兴趣,wait(或waitpid)将为您提供;请参阅手册页了解如何确定它是否正常退出,如果是,该状态是什么。
【讨论】: