如何获取 exec() 的输出?
How to get output of exec()?
如何通过 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
)将为您提供;请参阅手册页,了解如何确定它是否正常退出,如果是,状态是什么。
如何通过 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
)将为您提供;请参阅手册页,了解如何确定它是否正常退出,如果是,状态是什么。