fork()
通话就足够了。它也更灵活;它允许您调整子进程中的 I/O 重定向等操作,而不是使创建进程的系统调用复杂化。使用 SUID 或 SGID 程序,它允许子进程在执行其他进程之前失去其提升的特权。
如果您想要一种复杂的方式来创建流程,请查找该posix_spawn()
函数。
#include <spawn.h>
int posix_spawn(pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
不同之处在于posix_spawnp()
在 PATH 上搜索可执行文件。
还有一整套用于处理posix_spawn_file_actions_t
和posix_spawnattr_t
类型的其他函数(按照参考手册页底部的“另见”链接)。
这更像是CreateProcess()
在 Windows 上。不过,在大多数情况下,使用fork()
后跟使用exec()
更简单。
我不明白你的意思。子进程代码将由我编写,那么编写if (fork() == 0)
此代码与将这段代码放在 child's 的开头有什么区别main()
?
很多时候,您执行的代码不是您编写的,因此您无法修改子进程开始时发生的情况。想想贝壳;如果您从 shell 运行的唯一程序是您编写的程序,那么生活将变得非常贫困。
很多时候,您执行的代码会从许多不同的地方调用。特别是,考虑一个 shell 和一个程序,它们有时会在管道中执行,有时会在没有管道的情况下执行。被调用的程序不能告诉它应该做什么 I/O 重定向和修复;调用程序知道。
如果调用程序以提升的权限(SUID 或 SGID 权限)运行,则通常希望在运行另一个程序之前关闭这些权限。依靠其他程序知道该怎么做是......愚蠢的。