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