FORK
Section: Linux Programmer's Manual (2)
Updated: 2009-02-04
名字
fork - 子プロセスを生成する
fork - 生成创建子进程
格式
#include <>
pid_t fork(void);
说明
fork() は呼び出し元プロセスを複製して新しいプロセスを生成する。
fork() 复制原来的进程,而生成创建新的进程。
child で参照される新しいプロセスは、以下の点を除き、 parent で参照される呼び出し元プロセスの完全な複製である:
被child参照的新的进程 ,除下列要点以外,由被parent 参照的原进程完全复制生成:
- *
- 子プロセスは独自のプロセス ID を持ち、この PID は既存のどのプロセスグループ ((2)) の ID とも一致しない。
- 子进程拥有独立的进程ID,这个PID和已经存在的任何进程组((2))的ID不是一致的。
- *
- 子プロセスの親プロセス ID は、親プロセスのプロセス ID と同じである。
- 子进程的父进程ID和父进程的进程ID是相同的。
- *
- 子プロセスは親プロセスのメモリロック ((2), (2)) を引き継がない。
- 子进程不继承父进程的存储空间((2), (2))。
- *
- プロセスの資源利用量 ((2)) と CPU タイムカウンタ ((2)) が、子プロセスでは 0 にリセットされる。
- 进程的资源使用量((2))和CPU的时间计数器((2)),被子进程Reset为0 。
- *
- 子プロセスの処理待ちのシグナルの集合 ((2)) は、初期状態では空になる。
- 子进程的处理等待的signal集合((2)) 由初始状态置为空 。
- *
- 子プロセスは親プロセスからセマフォ調整 ((2)) を引き継がない。
- 子进程不从父进程继承semaphore调整((2)) 。
- *
- 子プロセスは親プロセスからレコードロック ((2)) を引き継がない。
- 子进程不从父进程继承RecordLock((2)) 。
- *
- 子プロセスは親プロセスからタイマー ((2), (2), timer_create(2)) を引き継がない。
- 子进程不从父进程继承计时器((2), (2), timer_create(2)) 。
- *
- 子プロセスは親プロセスから主だった非同期 I/O 操作 ((3), (3)) を引き継がない。
- 子进程不从父进程继承主要的非同期I/O操作 ((3), (3)) 。
上記のリストにあるプロセス属性は、POSIX.1-2001 で全て指定されている。
上述列表中的进程属性,都被指定在POSIX.1-2001中。
親プロセスと子プロセスは、以下の Linux 固有のプロセス属性も異なる:
父进程和子进程,存在着下列Linux固有的进程属性的差异点:
- *
- 子プロセスは親プロセスからディレクトリ変更通知 (dnotify) ((2) における F_NOTIFY の説明を参照) を引き継がない。
子进程不从父进程继承directory变更通知(dnotify)(参照在(2)中的 F_NOTIFY 的说明) 。
- *
- (2) の PR_SET_PDEATHSIG の設定がリセットされ、子プロセスは親プロセスが終了したときにシグナルを受信しない。
(2)的PR_SET_PDEATHSIG 的设定被Reset,子进程在父进程终了结束时,不接收signal。
- *
- (2) の MADV_DONTFORK フラグでマークされたメモリマッピングは、 fork() によって引き継がれない。
- 用(2)的MADV_DONTFORK Flag标识的MemoryMapping不通过 fork() 进行继承。
- *
- 子プロセスの終了シグナルは常に SIGCHLD である ((2) を参照)。
- 子进程的结束Signal通常是SIGCHLD ((2) 请参照)。
-
さらに以下の点について注意すること:
还有,下列要点请注意:
- *
- 子プロセスはシングルスレッドで生成される。つまり、 fork() を呼び出したスレッドとなる。親プロセスの仮想アドレス空間全体が子プロセスに複製される。これにはミューテックス (mutex) の状態・条件変数・ pthread オブジェクトが含まれる。これが引き起こす問題を扱うには、 (3) を使うと良いだろう。
- *
- 子プロセスは親プロセスが持つオープンファイルディスクリプタの集合のコピーを引き継ぐ。子プロセスの各ファイルディスクリプタは、親プロセスのファイルディスクリプタに対応する同じオープンファイル記述 (file description) を参照する ((2) を参照)。これは 2 つのディスクリプタが、ファイル状態フラグ・現在のファイルオフセット、シグナル駆動 (signal-driven) I/O 属性 ((2) における F_SETOWN, F_SETSIG の説明を参照) を共有することを意味する。
- *
- 子プロセスは親プロセスが持つオープンメッセージキューディスクリプタ ((7) を参照) の集合のコピーを引き継ぐ。子プロセスの各ディスクリプタは、親プロセスのディスクリプタに対応する同じオープンメッセージキューディスクリプタを参照する。これは 2 つのディスクリプタが同じフラグ (mq_flags) を共有することを意味する。
- *
- 子プロセスは、親プロセスのオープン済みのディレクトリストリームの集合 ((3) 参照) のコピーを継承する。 POSIX.1-2001 では、親プロセスと子プロセス間の対応するディレクトリストリームはディレクトリストリームの位置 (positioning) を共有してもよいとされている。 Linux/glibc ではディレクトリストリームの位置の共有は行われていない。
返回值
成功した場合、親プロセスには子プロセスの PID が返され、子プロセスには 0 が返される。
成功的时候,在父进程中子进程的PID被返回,在子进程中0被返回。
失敗した場合、親プロセスに -1 が返され、子プロセスは生成されず、 errno が適切に設定される。
失败的场合,在父进程中 -1被返回,子进程不被生成,适当的ErrorNumber被设置。
Error
- EAGAIN
- 親プロセスのページ・テーブルのコピーと子プロセスのタスク構造に生成に必要なメモリを fork() が割り当てることができなかった。
fork()不能分配,父进程的Page·Table的Copy 和 生成子进程的Task构造的必要的Memory。
- EAGAIN
- 呼び出し元の RLIMIT_NPROC 資源の制限 (resource limit) に達したために、新しいプロセスを生成できなかった。
达到原呼出的RLIMIT_NPROC 资源的限制(resource limit) ,不能生成新的进程。
この制限を超えるには、プロセスは CAP_SYS_ADMIN または CAP_SYS_RESOURCE ケーパビリティ (capability) を持っていなくてはならない。
超过这个限制,进程必须具备CAP_SYS_ADMIN 或者 CAP_SYS_RESOURCE 的能力。
- ENOMEM
- メモリが足りないために、 fork() は必要なカーネル構造体を割り当てることができなかった。
Memory不足,fork() 不能分配必要的核心结构体。
依据
SVr4, 4.3BSD, POSIX.1-2001.
注意
Linux では、
fork() を 書き込み時コピー (copy-on-write)・ページを用いて実装している。したがって、fork を行うことの唯一のデメリットは、親プロセスのページ・テーブルを複製と子プロセス自身のタスク構造の作成のための時間とメモリが必要なことである。
glibc 2.3.3 以降では、 NPTL スレッド実装の一部として提供されている glibc の fork() ラッパー関数は、カーネルの fork() システムコールを起動するのではなく、 (2) を起動する。 (2) に渡すフラグとして、伝統的な fork() システムコールと同じ効果が得られるようなフラグが指定される。 glibc のラッパー関数は (3) を使って設定されている任意の fork ハンドラを起動する。
例
参照 (2) 以及
(2) 。
关联项目
(2),
(2),
(2),
(2),
(2),
(2),
(3),
(7),
(7)
阅读(1147) | 评论(0) | 转发(0) |