在《system() 执行 shell 命令》中,我们介绍了 system 执行 shell 命令的方法,system 返回值比较混乱,难以理解,而且 popen 在处理子进程标准输出上会很方便。
注意:管道只能处理标准输出,不能处理标准错误输出。
popen 和 pclose 的实现与 system 类似,多了一步创建管道的操作。
popen 成功返回 FILE 句柄,失败返回 NULL, 失败的原因可能为 fork 或 pipe 失败,也可能为分配内存失败;
pclose 失败返回 -1, 成功则返回 exit status, 同 system 类似,需要用 WIFEXITED, WEXITSTATUS 等获取命令返回值。
此外,同 system 类似, pclose 会等待进程退出,如果等不到进程退出(例如已经被 wait 回收),则 error 设置为 ECHILD.
注意:
1. pclose 仅仅是为了回收子进程,避免僵尸进程的产生;
2. 和 system 一样,SIGCHLD 依然会影响 popen,见示例程序。
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include