在 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 兼容外壳。)
fork()
创建一个新进程。如果您不需要这样做,只需使用system()
(或popen()
)。您可能需要第二个进程来实现并行性,或者对作业进行更细粒度的控制,但如果作业是同步的,您通常不会关心这一点。
另一方面,我发现 95% 的使用system()
是不必要的,或者以某种方式更好地使用另一种方式(例如使用 zlib 而不是system("gzip")
)。所以也许最好的答案是两者都不使用!
通过system()
另外调用一个 shell 进程,这可能不是你想要的。
此外,仅当此类 shell 死亡时才通知调用进程,而不是当 shell 运行的实际进程死亡时才通知调用进程。
system() 将输入命令并像用户输入的那样执行它。我大多看到它喜欢system("pause"); system("cls");
但是如果你需要控制子进程,你要fork。