使用fork/execvp和系统调用的区别

14

使用system()执行二进制文件与使用fork/execvp的组合有什么区别?

在安全性、可移植性和性能方面是否有差异。

5个回答

15

系统还使用了fork/exec组合。如果您自己使用fork/exec,则可以并行执行运行中的进程,而system是阻塞的(包括wait)。此外,system不直接执行命令,而是通过shell执行(这会导致setuid位出现问题),并且system会阻止/忽略某些信号(SIGINT、SIGCHILD、SIGQUIT)。


8
是的,system()会通过shell运行命令,而exec()会直接运行命令。当然,引入shell会带来漏洞和攻击风险。
注:当然,man页面提供了更多细节。

如果允许用户输入命令,引入一个shell会导致漏洞和攻击的风险。如果您的应用程序生成shell命令的文本,则不存在利用漏洞的可能性。 - S.Lott
一种可能性是,如果用户在执行您的代码之前更改了某些 shell 变量,则存在利用漏洞的可能性,但不确定其通用性如何。 - foo
您还可以使用路径/链接器技巧。打破链接:利用链接器 - jww

6

system()函数将会fork()/exec()出一个shell,然后shell再fork()/exec()所需启动的程序。

因此,system()函数比fork()/exec()函数要重两倍。


3

system()在Windows上可以工作,但fork()不行。

除非您使用诸如Cygwin之类的兼容层,但即使是这样,fork也可能非常昂贵。


1
@Nathan,该问题提到了可移植性差异,这就是。 - finnw
我有一个关于费用问题的疑问,为什么fork比system更昂贵。System也会fork一个进程,但它会fork两个进程。 - foo
@foo:在Windows上,fork并不存在,cygwin只是模拟它。请参阅http://www.cygwin.com/faq/faq.api.html#faq.api.fork。 - finnw

2

还有popen(),它类似于system(),但允许读取子进程的输出并提供输入


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接