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

Syn*_*ror 21 c system popen

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

编辑:我试图使用system,但执行过程似乎陷入最后,并没有返回到我的代码.

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

谢谢

Ker*_* SB 34

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

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

这两个函数都调用某种形式的shell来执行命令(例如/bin/sh在Linux上,可能cmd.exe在Windows上).如果你想直接执行一个可执行文件,并且你在Posix上,你也可以查看exec*-family of functions with fork()(与exec() 替换当前进程).

  • +1,我从未意识到popen调用shell. (4认同)
  • 关于`popen`的重要说明:它可以控制输入**或**输出流,而不是两者. (4认同)
  • @JoachimPileborg:当然.也许我应该写"xor"?唉,英语和C是不同的. (4认同)

cHa*_*Hao 5

使用popen,如果你想运行shell命令,并希望父进程能够交谈的孩子。(它会将孩子的输入或输出与您返回的流挂钩。)否则,建议使用exec函数系列(可能与结合使用fork);execd进程继承了大多数打开的文件描述符(包括stdin,stdout和stderr),因此您可以将输入输出连接到自己喜欢的任何东西...此外,对安全性的影响也较小。

system通常最好避免使用,除非必须运行shell命令。它产生一个运行命令的外壳程序,外壳程序可以按自己喜欢的任何方式解析该命令。特别是,某些环境变量(如$IFS和/或$PATH)可以通过某种方式修改,以使父级执行您从未打算执行的程序。尽管popen看起来做同样的事情,但它至少提供了使其在一般情况下值得的功能。