C中的popen()和system()有什么区别

时间:2011-12-16 18:11:28

标签: c system popen

我想在我的C代码中执行二进制文件。执行哪个更好? popen()system()

编辑:我尝试使用system,但执行过程似乎陷入了最终并且没有返回到我的代码。

有关该怎么做的任何建议?

由于

2 个答案:

答案 0 :(得分:32)

popen()使您可以控制进程的输入或输出文件流。 system()没有。如果您不需要访问进程的I / O,则可以使用system()来简化。

system()在C89和C99中; popen()仅为Posix(尽管Windows API也有一个)。

两个函数都会调用某种形式的 shell 来执行命令(例如Linux上的/bin/sh,而Windows上可能cmd.exe。如果你想直接执行一个可执行文件并且你在Posix上,你也可以查看exec* - 与fork()结合的函数系列(因为exec() 替换< / em>当前流程)。

答案 1 :(得分:4)

如果要运行shell命令并希望父进程能够与子进程通信,请使用popen。 (它将孩子的输入或输出挂钩到你回来的流。)否则,更喜欢exec系列函数(可能与fork一起使用); exec'进程继承了大多数打开的文件描述符(包括stdin,stdout和stderr),因此您可以将输入输出挂钩到您喜欢的任何内容...而且,更少安全隐患。

除非必须运行shell命令,否则通常最好避免使用

system。它产生一个shell来运行命令,shell可以以任何方式解析命令。特别是,某些环境变量(如$IFS和/或$PATH)可以通过这样的方式进行修改,以使父进程执行您从未想过的程序。虽然popen似乎做同样的事情,但它至少提供了在一般情况下值得的功能。