fork , f_fork , p_fork 或 vfork 子例程
用途
创建新进程。
库
fork, f_fork和 vfork: 标准 C 库 (libc.a)
语法
#include <unistd.h>
pid_t fork(void)
pid_t p_fork(uint)
unsigned int flags;
pid_t f_fork(void)
int vfork(void)
描述
每个派生子例程创建一个新进程。 新流程 (子流程) 是调用流程 (父流程) 的几乎完全相同的副本。 子流程将从父流程继承以下属性:
- 环境
- Close-on-exec 标志 (在 执行 子例程中描述)
- 信号处理设置 (例如, SIG_DFL 值, SIG_IGN 值和 函数地址 参数)
- 设置用户标识方式位
- 设置组标识方式位
- 概要分析打开和关闭状态
- 细调值
- 所有连接的共享库
- 进程组标识
- 蒂 组标识 (在 退出, 退出或 退出 (_出口) 子例程, 信号 子例程和 养 子例程中描述)
- 当前目录
- 根目录
- 文件方式创建掩码 (在 Umask 子例程中描述)
- 文件大小限制 (在 乌勒明 子例程中描述)
- 连接的共享内存段 (在 什马特 子例程中描述)
- 附加的映射文件段 (在 什马特 子例程中描述)
- 调试器进程标识和多进程标志 (如果父进程启用了多进程调试) (在 跟踪 子例程中描述)。
在以下方面,子流程与父流程不同:
- 子进程只有一个用户线程; 它是调用 fork 子例程的那个进程。
- 子进程具有唯一的进程标识。
- 子进程标识与任何活动进程组标识都不匹配。
- 子流程具有另一个父流程标识。
- 子进程具有其自己的父进程的文件描述符副本。 但是,子进程的每个文件描述符都与父进程的对应文件描述符共享一个公共文件指针。
- 将清除所有 塞马季 值。 有关 塞马季 值的信息,请参阅 塞地布 子例程。
- 子进程不继承进程锁定,文本锁定和数据锁定。 有关锁定的信息,请参阅 普洛克 子例程。
- 如果开启了多进程调试,那么将从父代继承 跟踪 标志; 否则,将重置 跟踪 标志。 有关请求 0 的 0 ,请参阅 跟踪 子例程。
- 子进程 乌特, 斯时, 屈时和 Cstime 子例程已设置为 0。 (有关更多信息,请参阅 盖特鲁里亚热 , 时代和 时代 子例程。)
- 将在子进程中清除任何暂挂警报。 (有关更多信息,请参阅 包括时间间隔, 塞蒂蒂默和 警报 子例程。)
- 子进程暂挂的信号集将初始化为空集。
- 子进程可以具有它自己的父进程消息目录的副本。
福克 子例程类似于 叉,但以下情况除外:
- 在创建 执行 函数后,子进程必须立即调用其中一个函数。 由于从不调用 叉 处理程序,因此在子进程中,应用程序数据,互斥对象和锁定都未定义。
p_fork 子例程类似于 fork ,只是可以指定零个或零个以上的标志。 FORK_NO_SHM 标志导致在不继承共享内存的情况下创建子进程。 FORK_FAST 标志在不调用派生处理程序的情况下创建子进程。 调用 p_fork(FORK_FAST) 等同于调用 f_fork()。 调用 p_fork(0) 等同于调用 fork()。
vfork 子例程作为较旧的 Berkeley Software Distribution (BSD) 系统程序的兼容性接口受支持,并且可以通过与 Berkeley Compatibility Library (libbsd.a) 一起编译来使用。 调用 vfork() 等同于调用 fork()。
注意在增强 X-Windows、X 工具包或 Motif 应用程序中使用 fork 子程序时,必须为子进程打开单独的显示连接(套接字)。 子进程绝不应使用与父进程相同的显示连接。 显示连接是通过套接字实现的,而套接字是由子进程继承的。 任何试图让多个进程写入同一个显示连接的尝试都会导致在字级别对 X 协议包进行随机交织。 写入套接字的结果数据将不是有效的或未定义的 X 协议包,并且 X 服务器将无法对其进行解释。
注意: 虽然 fork 子例程可能与 Graphics Library 应用程序一起使用,但子进程不得进行任何其他 Graphics Library 子例程调用。 子应用程序继承了父代的部分图形硬件资源,但并非所有这些资源。 通过子进程绘制可能挂起图形适配器,增强型 X 服务器,或者可能导致不可预测的结果,并使系统进入不可预测状态。
有关其他信息,请参阅 /usr/lpp/GL/README 文件。
参数
- 标志
- 指定派生操作的行为。 您可以指定以下零个或多个值:
- FORK_NO_SHM
- 共享内存不是由子进程继承的。
- 叉快
- 未调用派生处理程序。 这与 f_fork () 子例程类似。 该子进程必须立即调用其中一个 exec 函数。
返回值
成功完成后,每个 fork 子例程将返回 0 值给 0 进程,并将子进程的进程标识返回给父进程。 否则,将向父进程返回-1的值,不创建子进程,并设置errno全局变量来指示错误。
错误代码
如果下列其中一项或多项为 true ,那么 fork 子例程不成功:
| 项 | 描述 |
|---|---|
| 再一次 | 超出运行系统范围或由单个用户运行的进程总数限制,或者系统没有创建另一个进程所需的资源。 |
| ENOMEM | 没有足够的空间可用于此进程。 |
| EPROCLIM | 如果 WLM 正在运行,那么可能已达到类中的进程数或线程数的限制。 |