为什么Unix有fork()而不是CreateProcess()?

Hay*_*tuk 12 unix winapi fork createprocess exec

我不明白为什么Unix有fork()创建新流程的原因.在Win32 API中,我们CreateProcess()创建了一个新进程并将可执行文件加载到其地址空间中,然后从入口点开始执行.但是Unix提供了用于创建新进程的fork,如果我想运行另一个进程,我不知道为什么要复制我的进程.

那么让我问这两个问题:

  1. 如果fork()然后exec()是更有效的,为什么没有一个功能forkexec(const char *newProc),因为我们将调用exec()之后fork(),几乎在所有情况下?
  2. 如果效率不高,为什么会fork()存在呢?

Jon*_*ler 12

这个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]);
Run Code Online (Sandbox Code Playgroud)

不同的是posix_spawnp()在PATH上搜索可执行文件.

处理posix_spawn_file_actions_tposix_spawnattr_t类型有一整套其他函数(按照引用手册页底部的"另请参见"链接).

CreateProcess()在Windows上更像.但是,在大多数情况下,使用fork()后续使用exec()更简单.


我不明白你的意思.子进程代码将由我编写,那么在if (fork() == 0)将这些代码写入子代的开头之间有什么区别main()呢?

通常,您执行的代码不是由您编写的,因此您无法修改在子进程开始时发生的情况.想想一个壳; 如果您从shell运行的唯一程序是您编写的程序,那么生活将变得非常贫困.

通常,您执行的代码将从许多不同的地方调用.特别是,考虑一个shell和一个程序,它有时会在管道中执行,有时候会在没有管道的情况下执行.被调用的程序无法分辨它应该做什么I/O重定向和修正; 调用程序知道.

如果调用程序以提升的权限(SUID或SGID权限)运行,则在运行另一个程序之前想要关闭这些"关闭"是正常的.依靠其他程序知道该做什么是......愚蠢.