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

时间:2013-02-12 10:42:22

标签: c++ c fork

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

system()

致电和

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

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

4 个答案:

答案 0 :(得分:19)

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

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

(通过不同的系统,我不是指Windows与Unix(因为Windows甚至没有fork):我说的是Red Hat Linux与Ubuntu。前者使用Bash来执行传递给{的内容{1}},后者是一个轻量级的POSIX兼容shell。)

答案 1 :(得分:3)

fork()创建了一个新流程。如果您不需要这样做,请使用system()(或popen())。您可能希望第二个进程实现并行性,或者对作业进行更细粒度的控制,但如果作业是同步的,通常您根本不关心它。

另一方面,我发现system()的95%的使用是不必要的,或者以某种方式更好地用另一种方式(例如使用zlib而不是system("gzip"))。所以也许最好的答案是不要使用它!

答案 2 :(得分:1)

通过system()另外调用一个shell进程,这可能不是你想要的。

此外,只有当shell运行的实际进程死亡时,才会通知调用进程。

答案 3 :(得分:0)

system()将输出命令并像用户输入的那样执行它。 我大多看到它像system("pause"); system("cls");

但是如果你需要控制子进程,你想要fork。