fork、f_fork 或 vfork 子程序

用途

创建新进程。

forkf_forkvfork: 标准 C 库 (libc.a)

语法

#include <unistd.h>
pid_t fork(void)
pid_t f_fork(void)
int vfork(void)

描述

fork子程序会创建一个新进程。 新流程 (子流程) 是调用流程 (父流程) 的几乎完全相同的副本。 子流程将从父流程继承以下属性:

  • 环境
  • 执行时关闭标志(在执行子程序中描述)
  • 信号处理设置(例如SIG_DFL值、 SIG_IGN值和功能地址参数)
  • 设置用户 ID 模式位
  • 设置组 ID 模式位
  • 剖析打开和关闭状态
  • 尼斯值
  • 所有附加的共享库
  • 流程组 ID
  • tty组 ID(在exitatexit_exit子程序、signal子程序和raise子程序中描述)
  • Current directory
  • 根目录
  • 文件模式创建掩码(在umask子程序中描述)
  • 文件大小限制(在ulimit子程序中描述)
  • 附加共享内存段(在shmat子程序中描述)
  • 附加映射文件段(在shmat子程序中描述)
  • 调试器进程 ID 和多进程标志,如果父进程已启用多进程调试(在ptrace子程序中描述)。

在以下方面,子流程与父流程不同:

  • 子进程只有一个用户线程,即调用fork子程序的线程。
  • The child process has a unique process ID.
  • The child process ID does not match any active process group ID.
  • 子进程有不同的父进程 ID。
  • The child process has its own copy of the file descriptors for the parent process. 但是,子进程的每个文件描述符都与父进程的对应文件描述符共享一个公共文件指针。
  • 清除所有semadj值。 有关semadj值的信息,请参阅semop子程序。
  • Process locks, text locks, and data locks are not inherited by the child process. 有关锁的信息,请参阅plock子程序。
  • 如果开启了多进程调试,'踪影标志将从父进程继承;否则,' 踪影标志将被重置。 有关请求 0 的信息,请参阅ptrace子程序。
  • The child process 时间, 时间, cutime, and 时间 subroutines are set to 0. (更多信息,请参阅getrusagetimesvtimes子程序)
  • 子进程会清除任何待处理的警报。 (更多信息,请参阅incintervalsetitimeralarm子程序)
  • 子进程的待处理信号集初始化为空集。
  • The child process can have its own copy of the message catalogue for the parent process.
注意如果在 X 窗口系统、X 工具包或 Motif 应用程序中使用forkvfork子程序,请为分叉进程打开一个单独的显示连接(套接字)。 如果子进程使用与父进程相同的显示连接,X 服务器将无法解释生成的数据。

福克 子例程类似于 ,但以下情况除外:

  • 在创建 执行 函数后,子进程必须立即调用其中一个函数。 由于从未调用过fork处理程序,子进程中的应用程序数据、互斥和锁都是未定义的。

vfork子程序作为旧版伯克利软件发行版(BSD)系统程序的兼容接口,可通过伯克利兼容库libbsd.a)编译使用。

在第 4 版操作系统中,父进程不必像 BSD 系统那样等待子进程退出或执行。 与 fork子程序一样,子进程将获得一个新的地址空间。 子进程不共享任何父进程地址空间。

注意增强 X-Windows、X 工具包或 Motif 应用程序中使用forkvfork子程序时,应为分叉进程打开一个单独的显示连接(套接字)。 子进程绝不能使用与父进程相同的显示连接。 显示连接是通过套接字实现的,而套接字是由子进程继承的。 任何试图让多个进程写入同一个显示连接的尝试都会导致在字级别对 X 协议包进行随机交织。 写入套接字的结果数据将不是有效的或未定义的 X 协议包,并且 X 服务器将无法对其进行解释。
注意尽管fork vfork子程序可用于图形库应用程序,但子进程不得调用任何其他图形库子程序。 子应用程序继承了父代的部分图形硬件资源,但并非所有这些资源。 通过子进程绘制可能挂起图形适配器,增强型 X 服务器,或者可能导致不可预测的结果,并使系统进入不可预测状态。

有关其他信息,请参阅 /usr/lpp/GL/README 文件。

返回值

成功完成后,fork子程序会向子进程返回 0 值,并向父进程返回子进程的进程 ID。 否则,将向父进程返回-1,不创建子进程,并设置errno全局变量来指示错误。

错误代码

如果以下情况中的一个或多个为真,则fork子程序不会成功:

描述
EAGAIN 超过了整个系统或单个用户运行的进程总数限制,或者系统不具备创建另一个进程所需的资源。
ENOMEM 没有足够的空间可用于此进程。
EPROCLIM 如果 WLM 正在运行,那么可能已达到类中的进程数或线程数的限制。