【问题标题】:what is the difference between popen() and system() in CC中的popen()和system()有什么区别
【发布时间】:2012-01-22 05:24:20
【问题描述】:

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

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

有什么建议吗?

谢谢

【问题讨论】:

  • man popenman system?
  • 你试过使用popen()吗?或者它的问题与你的二进制?你上次的编辑有点混乱
  • 使用popen 而不是system 对您的实际问题没有帮助:进程卡住了。

标签: c system popen


【解决方案1】:

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

system() 在 C89 和 C99 中; popen() 仅适用于 Posix(尽管 Windows API 也有)。

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

【讨论】:

  • @HeathHunnicutt:我也没有,直到五分钟前我听从了 Joachim 的建议 :-)
  • 关于popen 的重要说明:它使您可以控制输入 输出流,而不是两者。
  • @JoachimPileborg:当然。也许我应该写“xor”?唉,English 和 C 不一样。
  • 如果我用pclose 关闭管道fd,pclose 是否返回我用popen 触发的命令的退出值?
  • @Strubl: 与wait 的语义相同,即您必须使用这些宏来确定进程是正常返回还是通过信号返回,然后将返回值移位.
【解决方案2】:

如果您想运行 shell 命令并希望父进程能够与子进程对话,请使用 popen。 (它将孩子的输入或输出连接到您返回的流。)否则,更喜欢exec 系列函数(可能与fork 结合使用); exec'd 进程继承了大多数打开的文件描述符(包括 stdin、stdout 和 stderr),因此您可以将输入 挂接到您喜欢的任何内容...另外,安全隐患更少.

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

【讨论】:

  • 你只能做either输入输出,我相信。 popen() 也会生成一个 shell。
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 2010-11-25
  • 2012-06-05
  • 2020-08-24
  • 2010-10-29
  • 2010-10-22
相关资源
最近更新 更多