linux popen()与system()的区别

linux popen()与system()的区别

popen() 可以在调用程序和POSIX shell /usr/bin/sh 要执行的命令之间创建一个管道(请参阅sh-posix(1) )。

popen() 的参数是指向以空字符结尾的字符串的指针,这些字符串分别包含一个shell 命令行和一个I/O 模式,此

模式可以是进行读取的r ,或进行写入的w 。

popen() 可返回一个流指针,这样,当I/O 模式为w 时,便可以通过写入文件stream 来写入到命令的标准输入;

当I/O 模式为r 时,通过从文件stream 读取数据,从命令的标准输出读取数据。

popen() 打开的流应由pclose() 关闭,这需要等待终止关联的进程,然后返回命令的退出状态。

因为打开的文件是共享的,所以类型为r 的命令可用作输入过滤器,类型为w 的命令可用作输出过滤器。

 

system() 可执行由command 指向的字符串指定的命令。已执行命令的环境就如同使用fork() (请参阅fork(2) )

创建了一个子进程,子进程按以下方式通过调用execl() (请参阅exec(2) )来调用sh-posix(1) 实用程序:

execl("/usr/bin/sh", "sh", "-c", command, 0);

system() 在等待命令终止时将忽略SIGINT 和SIGQUIT 信号,同时阻塞SIGCHLD 信号。如果这会导致应用程

序错过一个终止它的信号,则应用程序应检查system() 的返回值;如果由于收到某个信号而终止了命令,应用程

序应采取一切适当的措施。

system() 不影响除自己创建的一个或多个进程以外的调用进程的任何子进程的终止状态。

在子进程终止之前, system() 不会返回。

  PS:system与popen函数的效率

posted @ 2013-02-22 20:11  赤色  阅读(2887)  评论(0编辑  收藏  举报
知识共享许可协议本博客作品采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议进行许可。