Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的popen()和system()有什么区别_C_System_Popen - Fatal编程技术网

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

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

我想在我的C代码中执行一个二进制代码。哪一个更好地执行
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
相同,即你必须使用这些宏来确定进程是正常返回还是通过信号返回,然后对返回值进行移位。