如何从execl命令中捕获输出

我使用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; } 

我在控制台上看到在terminal上做“谁”的结果。 我想知道的是,如果有任何function来“捕捉”命令的输出结果。 我的意思是说,如果有什么可以抓住这个的话:

 feuplive tty5 2009-11-21 18:20 

谁是谁命令的结果之一。

首先, execl不会返回,除非有可执行文件没有找到的问题。 那个sleep(4)可能永远不会被执行。

至于重定向和获取输出,请查看Unix编程常见问题解答 。 寻找spawn_background_command

要做到这一点,你需要打开一个管道。 然后用管道的写入结束替换孩子的标准输出,并从父管道的读取结束读取。 像你的代码的修改版本一样:

 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; } 

exec()系列函数从常规的可执行文件创建一个新的过程映像。 该文件是可执行的对象文件或解释器脚本。 成功调用exec()函数不会返回,因为调用进程在功能上被新进程替换。

所以exec()之后的任何代码都不会被执行,除非失败。

如果你想捕获一个shell命令的输出,你需要popen 。