Hay*_*tuk 12 unix winapi fork createprocess exec
我不明白为什么Unix有fork()创建新流程的原因.在Win32 API中,我们CreateProcess()创建了一个新进程并将可执行文件加载到其地址空间中,然后从入口点开始执行.但是Unix提供了用于创建新进程的fork,如果我想运行另一个进程,我不知道为什么要复制我的进程.
那么让我问这两个问题:
fork()然后exec()是更有效的,为什么没有一个功能forkexec(const char *newProc),因为我们将调用exec()之后fork(),几乎在所有情况下?fork()存在呢?Jon*_*ler 12
这个fork()电话就足够了.它也更灵活; 它允许您调整子进程中的I/O重定向,而不是使系统调用复杂化以创建进程.使用SUID或SGID程序,它允许子进程在执行其他进程之前失去其提升的权限.
如果您想要一种复杂的方法来创建流程,请查找该posix_spawn()功能.
Run Code Online (Sandbox Code Playgroud)#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)将这些代码写入子代的开头之间有什么区别main()呢?
通常,您执行的代码不是由您编写的,因此您无法修改在子进程开始时发生的情况.想想一个壳; 如果您从shell运行的唯一程序是您编写的程序,那么生活将变得非常贫困.
通常,您执行的代码将从许多不同的地方调用.特别是,考虑一个shell和一个程序,它有时会在管道中执行,有时候会在没有管道的情况下执行.被调用的程序无法分辨它应该做什么I/O重定向和修正; 调用程序知道.
如果调用程序以提升的权限(SUID或SGID权限)运行,则在运行另一个程序之前想要关闭这些"关闭"是正常的.依靠其他程序知道该做什么是......愚蠢.