表面上区别
表白上它们的区别是调用system函数输入命令后,system函数就能将结果显示出来,而popen函数并不会将直接返回出来,而是把结果保存在流中,输入从流中读取出结果然后将结果打印出来。
实际上
实际上system中它屏蔽了 SIG_INT, SIG_QUIT, 然后阻塞wait 子进程,以此来保证子进程正确的回收。
实际上而执行了popen , 还必须执行 pclose 将这个流关闭,否则就有僵尸进程。因为popen 中只是申请了管道,然后通过管道与生成的子进程进程数据交互,然后execl去替换命令,然后退出,并没有实际上的wait子进程,只有调用了 pclose 函数,执行命令的子进程才能被回收,否则就产生了僵尸进程。
int system(const char *command)
{
struct sigaction sa_ignore, sa_intr, sa_quit;
sigset_t block_mask, orig_mask;
pid_t pid;
sigemptyset(&block_mask);
sigaddset(&block_mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &block_mask, &orig_mask); //1. block SIGCHLD
sa_ignore.sa_handler = SIG_IGN;
sa_ignore.sa_flags = 0;
sigemptyset(&sa_ignore.sa_mask);
sigaction(SIGINT, &sa_ignore, &sa_intr); //2. ignore SIGINT signal
sigaction(SIGQUIT, &sa_ignore, &sa_quit); //3. ignore SIGQUIT signal
switch((pid = fork()))
{
case -1:
return -