EN JA
PDFORK(2)
PDFORK(2) FreeBSD System Calls Manual PDFORK(2)

名称

pdfork, pdgetpid, pdkill, pdwait4プロセス記述子を管理するためのシステムコール

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/procdesc.h>

int
pdfork( int *fdp, int flags);

int
pdgetpid( int fd, pid_t *pidp);

int
pdkill( int fd, int signum);

int
pdwait4( int fd, int *status, int options, struct rusage *rusage);

解説

プロセス記述子は、プロセスを表し、成功するなら、 fdp によって指された整数のプロセス記述子を返す、 fork(2) の変異型である、 pdfork() を使用して作成される特殊なファイル記述子です。 pdfork() を通して作成されたプロセスは、終了時に SIGCHLD を引き起こしません。 pdfork() は、次のフラグを受け付けます:
PD_DAEMON
デフォルトのクローズ時の終了 (terminate-on-close) の振る舞いの代わりに、プロセスは、 kill(2) で明白に kill されるまで、生き続けることができます。

このオプションは、 capsicum(4) ケーパビリティモードで許可されません ( cap_enter(2) を参照)。

pdgetpid() は、プロセス記述子 fd で、プロセス ID (PID) を問い合わせます。

pdkill() は、PID でなく、プロセス記述子 fd を受け付けることを除いて、 kill(2) と機能的に同じです。

pdwait4() は、 wait4(2) と同様に振る舞いますが、PID でなくプロセス記述子の引数に対して動作します。

また、次のシステムコールは、プロセス記述子に特有の影響を与えます:

fstat(2) は、プロセス記述子の状態について問い合わせます。現在、 st_mode, st_birthtime, st_atime, st_ctimest_mtime フィールドだけが定義されています。所有者の読み込み、書き込みと実行ビットが設定されているなら、プロセス記述子によって表されるプロセスは、まだ生きています。

poll(2)select(2) は、プロセス状態遷移に対してウェートすることができます。現在、 POLLHUP だけが定義され、プロセスが死ぬとき、引き起こされます。

close(2) は、 PD_DAEMON が設定されていないなら、プロセス記述子をクローズします。プロセスがまだ生きていて、これがプロセス記述子への最後の参照であるなら、プロセスは、シグナル SIGKILL で終了されます。

pdfork と関連する関数は、 procdesc(4) に記述されている options PROCDESC に依存しています。

戻り値

pdfork() は、 fork(2) が行うように、PID、0 または -1 を返します。

pdgetpid() と pdkill() は、成功すれば 0 を、失敗すれば -1 を返します。

pdwait4() は、成功すれば PID を、失敗すれば -1 を返します。

エラー

これらの関数は、次を追加して、それらの PID ベースと同等物と同じエラー番号を返します (例えば、 pdfork() は、 fork(2) と同じエラー番号を返します):
[ EINVAL]
pdkill() へ与えられたシグナル番号が無効です。
[ ENOTCAPABLE]
動作しているプロセス記述子には、十分な権利がありません (例えば、 pdkill() のための CAP_PDKILL)。

歴史

pdfork(), pdgetpid(), pdkill() と pdwait4() システムコールは、 FreeBSD 9.0 ではじめて登場しました。

プロセス記述子モードのサポートは、 TrustedBSD プロジェクトの一環として開発されました。

作者

これらの関数とケーパビリティ機能は、Google Inc. からの助成金の支援によって University of Cambridge Computer Laboratory の Robert N. M. Watson <rwatson@FreeBSD.org>と Jonathan Anderson <jonathan@FreeBSD.org>によって作成されました。

バグ

pdwait4() は、まだ実装されていません。
August 28, 2013 FreeBSD