我正在使用execl
函数从C运行Linux进程。例如:
int cmd_quem() {
int result;
result = fork();
if(result < 0) {
exit(-1);
}
if (result == 0) {
execl("/usr/bin/who", "who", NULL);
sleep(4); //checking if father is being polite
exit(1);
}
else {
// father's time
wait();
}
return 0;
}
我在控制台上得到了在终端上做“谁”的结果。我想知道的是,是否有任何函数可以“捕获”命令的输出结果。我的意思是,如果无论如何都要抓住这个:
feuplive tty5 2009-11-21 18:20
who命令产生的行之一。
答案 0 :(得分:5)
首先,execl
不会返回,除非出现类似可执行文件的问题。 sleep(4)
可能永远不会被执行。
关于重定向和获取输出,请查看Unix Programming FAQ。寻找 spawn_background_command 。
答案 1 :(得分:4)
要执行此操作,您需要打开管道。然后,将子项的stdout替换为管道的写入端,并从父管道的读取端读取。像这个代码的修改版本:
int cmd_quem(void) {
int result;
int pipefd[2];
FILE *cmd_output;
char buf[1024];
int status;
result = pipe(pipefd);
if (result < 0) {
perror("pipe");
exit(-1);
}
result = fork();
if(result < 0) {
exit(-1);
}
if (result == 0) {
dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
close(pipefd[0]);
close(pipefd[1]);
execl("/usr/bin/who", "who", NULL);
_exit(1);
}
/* Parent process */
close(pipefd[1]); /* Close writing end of pipe */
cmd_output = fdopen(pipefd[0], "r");
if (fgets(buf, sizeof buf, cmd_output)) {
printf("Data from who command: %s\n", buf);
} else {
printf("No data received.\n");
}
wait(&status);
printf("Child exit status = %d\n", status);
return 0;
}
答案 2 :(得分:2)
exec()系列函数从常规可执行文件创建新的过程映像。此文件是可执行对象文件或解释器脚本。成功调用exec()函数没有返回,因为调用进程在功能上被新进程替换。
因此除非失败,否则永远不会执行exec()之后的任何代码。
如果要捕获shell命令的输出,则需要popen。