到system()或fork()/ exec()?

Spa*_*rky 14 c c++ fork

在unix中,似乎有两种从C运行外部可执行文件的常用方法

system()
Run Code Online (Sandbox Code Playgroud)

打电话和

pid = fork()
switch(pid)
//switch statement based on return value of pid, 
//one branch of which will include and exec() command
Run Code Online (Sandbox Code Playgroud)

在函数等效的情况下,有没有理由更喜欢fork/exec而不是系统(父进程等待子进程完成,没有从子进程返回复杂的信息)?

Fre*_*Foo 19

system执行一个命令解释器,即一个shell,它(a)比直接fork/exec慢,(b)在不同的系统上可能表现不同,(c)如果你从一个不受信任的传递一个字符串是一个潜在的安全隐患资源.此外,system等待子进程退出,而您可能希望它与父进程同时运行.

更一般地说,低级fork/exec为您提供了额外的控制:在两个操作之前或之间,您可能需要chdir,打开管道,关闭文件描述符,设置共享内存等.

(通过不同的系统,我不是指Windows与Unix(因为Windows甚至没有fork):我说的是Red Hat Linux与Ubuntu.前者使用Bash来执行传递的内容system,后者是轻量级POSIX兼容外壳.)

  • @Celeritas从某种意义上说(系统调用也是OS API),但你的结论是错误的,正如我在答案中所说的那样.`system`不添加检查; 它添加了未经检查的功能. (3认同)