to system() or fork()/exec()?

to system() or fork()/exec()?

本文关键字:exec or system to fork      更新时间:2023-10-16

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

system()

呼叫和

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

如果fork/exec在功能上是等效的(父进程等待子进程完成,而子进程没有返回复杂的信息),那么有什么理由更喜欢forx/exec而不是系统吗?。

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

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

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

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

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

通过system()还会调用一个shell进程,这可能不是您想要的。

此外,只有当这样的shell死亡时,调用进程才会得到通知,而不是当shell运行的实际进程死亡时。

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

但是,如果您需要控制子进程,则需要fork.