C中的popen()和system()有什么区别
我想在我的C代码中执行一个二进制代码。哪一个更好地执行C中的popen()和system()有什么区别,c,system,popen,C,System,Popen,我想在我的C代码中执行一个二进制代码。哪一个更好地执行popen()或system() 编辑:我尝试使用系统,但执行的进程最终似乎陷入困境,无法返回到我的代码 有什么建议吗 谢谢popen()让您可以控制进程的输入或输出文件流系统()。如果不需要访问进程的I/O,为了简单起见,可以使用system() system()位于C89和C99中popen()仅为Posix(尽管Windows API也有一个) 这两个函数都调用某种形式的shell来执行命令(例如,在Linux上是/bin/sh,在Wi
popen()
或system()
编辑:我尝试使用系统
,但执行的进程最终似乎陷入困境,无法返回到我的代码
有什么建议吗
谢谢popen()
让您可以控制进程的输入或输出文件流<代码>系统()。如果不需要访问进程的I/O,为了简单起见,可以使用system()
system()
位于C89和C99中popen()
仅为Posix(尽管Windows API也有一个)
这两个函数都调用某种形式的shell来执行命令(例如,在Linux上是
/bin/sh
,在Windows上可能是cmd.exe
)。如果您想直接执行一个可执行文件,并且您在Posix上,您还可以查看与fork()
(因为exec()
替换了当前进程)结合使用的exec*
-函数系列.如果要运行shell命令并希望父进程能够与子进程对话,请使用popen
。(它将子对象的输入或输出挂接到您返回的流上。)否则,更喜欢exec
函数系列(可能与fork
结合使用)exec
'd进程继承大多数打开的文件描述符(包括stdin、stdout和stderr),因此您可以将输入和输出挂接到您喜欢的任何位置……此外,安全性方面的影响更少
system
通常是最好避免的,除非您必须运行shell命令。它生成一个shell来运行该命令,并且shell可以以任何方式解析该命令。特别是,某些环境变量(如$IFS
和/或$PATH
)可以修改为导致父级执行您从未打算执行的程序。虽然popen
似乎做了同样的事情,但它至少提供了在一般情况下值得使用的功能。man-popen
和man-system
?您尝试过使用popen()吗?还是你的问题?您上一次编辑有点混乱,使用popen
而不是system
无助于解决您的实际问题:流程陷入困境。我相信您只能进行输入或输出popen()
也会产生一个shell。@希森尼克特:直到五分钟前,当我听从约阿希姆的建议时,我也没有这样做:-)关于popen
:它让你控制输入或输出流,而不是两者。@JoachimPileborg:当然。也许我应该写“xor”?唉,英语和C是不同的。如果我用pclose
关闭管道fd,pclose
是否返回我用popen
触发的命令的退出值?@Strubbl:它的语义将与wait
相同,即你必须使用这些宏来确定进程是正常返回还是通过信号返回,然后对返回值进行移位。