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

在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而不是系统(父进程等待子进程完成,没有从子进程返回复杂的信息)?

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

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

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

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

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

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

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

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

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