使用system()执行二进制文件与使用fork/execvp的组合有什么区别?
在安全性、可移植性和性能方面是否有差异。
系统还使用了fork
/exec
组合。如果您自己使用fork
/exec
,则可以并行执行运行中的进程,而system
是阻塞的(包括wait
)。此外,system
不直接执行命令,而是通过shell执行(这会导致setuid位出现问题),并且system
会阻止/忽略某些信号(SIGINT、SIGCHILD、SIGQUIT)。
system()
函数将会fork()
/exec()
出一个shell,然后shell再fork()
/exec()
所需启动的程序。
因此,system()
函数比fork()
/exec()
函数要重两倍。
system()在Windows上可以工作,但fork()不行。
除非您使用诸如Cygwin之类的兼容层,但即使是这样,fork也可能非常昂贵。
还有popen(),它类似于system(),但允许读取子进程的输出并提供输入