PIDFILE(3) | FreeBSD Library Functions Manual | PIDFILE(3) |
名称
pidfile_open, pidfile_write, pidfile_close, pidfile_remove — PID ファイル操作のためのライブラリライブラリ
System Utilities Library (libutil, -lutil)書式
#include < libutil.h> struct pidfh *
pidfile_open( const char *path, mode_t mode, pid_t *pidptr);
int
pidfile_write( struct pidfh *pfh);
int
pidfile_close( struct pidfh *pfh);
int
pidfile_remove( struct pidfh *pfh);
int
pidfile_fileno( struct pidfh *pfh);
解説
pidfile 関数ファミリによってデーモンは、PID ファイルを取り扱うことができます。 pidfile をロックするために flopen(3) を使用して、既に実行しているデーモンを検出します。 pidfile_open() 関数は、 path 引数によって指定されたファイルをオープンする (かまたは作成し)、それをロックします。 pidptr 引数が NULL でなく、ファイルをロックすることができないなら、関数は、既に実行しているデーモンの PID、またはデーモンが、まだ PID を書き込まなかった場合に、 -1
を格納するために使用します。関数がここでファイル中へプロセスの PID を書き込まないので、 fork() する前に使用することができ、必要であるとき、適切なエラーメッセージとともに終了します。 path 引数が NULL であるなら、 /var/run/< progname> .pid ファイルが使用されます。 pidfile_open() 関数は、pidfile をオープンするとき、O_CLOEXEC close-on-exec フラグを設定します。
pidfile_write() 関数は、以前にオープンされたファイルにプロセス PID を書き込みます。ファイルは、書き込みの前に切り詰められるので、複数回 pidfile_write() 関数を呼び出すことがサポートされています。
pidfile_close() 関数は、pidfile をクローズします。子プロセスを開始するためにデーモンを fork() するために使用されるべきです。
pidfile_remove() 関数は、pidfile をクローズして、削除します。
pidfile_fileno() 関数は、オープンした pidfile のファイル記述子を返します。
戻り値
pidfile_open() 関数は、成功すれば、 pidfh 構造体への有効なポインタを返し、エラーの場合は、 NULL を返します。エラーが発生するなら、 errno が設定されます。
The pidfile_write(), pidfile_close(), and pidfile_remove() functions return the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.
pidfile_fileno() 関数は、低レベルのファイル記述子を返します。それは、 -1
を返し、NULL の pidfh が指定されるか、または pidfile がもはやオープンされていないなら、 errno を設定します。
使用例
次の例は、どのような順序でこれらの関数が使用されるべきであるかを示します。 NULL を pidfile_write(), pidfile_remove(), pidfile_close() と pidfile_fileno() 関数に渡すことは安全であることに注意してください。
struct pidfh *pfh; pid_t otherpid, childpid; pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid); if (pfh == NULL) { if (errno == EEXIST) { errx(EXIT_FAILURE, "Daemon already running, pid: %jd.", (intmax_t)otherpid); } /* 他の理由で pidfile を作成することができないなら、単に警告. */ warn("Cannot open or create pidfile"); /* 別の pidfile_* 関数が errno を EDOOFUS に設定すること以外は * 何もしないことによって、そのような状況を扱うことができるので、 * たとえ pfh が NULL でも、継続することができます。 */ } if (daemon(0, 0) == -1) { warn("Cannot daemonize"); pidfile_remove(pfh); exit(EXIT_FAILURE); } pidfile_write(pfh); for (;;) { /* 動作する. */ childpid = fork(); switch (childpid) { case -1: syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno)); break; case 0: pidfile_close(pfh); /* 子供で動作する. */ break; default: syslog(LOG_INFO, "Child %jd started.", (intmax_t)childpid); break; } } pidfile_remove(pfh); exit(EXIT_SUCCESS);
エラー
pidfile_open() 関数は、次の場合に失敗します:- [ EEXIST]
-
いくつかのプロセスは、与えられた pidfile で既にロックを保持しています。これは、デーモンが既に実行していることを意味します。
pidptr 引数が
NULL でないなら、関数は、既に実行しているデーモンの PID、またはデーモンが、まだ PID を書き込まなかった場合に、
-1
を格納するために使用します。 - [ ENAMETOOLONG]
- 指定された pidfile の名前が長過ぎます。
- [ EINVAL]
- いくつかのプロセスは、与えられた pidfile で既にロックを保持していますが、そこから読み込まれた PID は、無効です。
pidfile_open() 関数は、また、失敗して fstat(2), open(2) と read(2) 呼び出しで明記されたエラーのいずれかが errno に設定されます。
pidfile_write() 関数は、次の場合に失敗します:
- [ EDOOFUS]
- 不適当な関数使用。たぶん pidfile_open() の前に呼び出されています。
pidfile_write() 関数は、また、失敗して fstat(2), ftruncate(2), と write(2) 呼び出しで明記されたエラーのいずれかが errno に設定されます。
pidfile_close() 関数は、また、失敗して close(2) と fstat(2) 呼び出しで明記されたエラーのいずれかが errno に設定されます。
pidfile_remove() 関数は、次の場合に失敗します:
- [ EDOOFUS]
- 不適当な関数使用。たぶん pidfile_write() を作成したプロセスから呼び出していません。
pidfile_remove() 関数は、また、失敗して close(2), fstat(2), write(2) と unlink(2) システムコールと flopen(3) ライブラリ関数で明記されたエラーのいずれかが errno に設定されます。
pidfile_fileno() 関数は、次の場合に失敗します:
- [ EDOOFUS]
- 不適切な関数の使用。たぶん pidfile_open() を使用したプロセスから呼び出されていません。
作者
pidfile の機能は、 <jmg@FreeBSD.org>からの考えに基づいています。コードとマニュアルページは、
<pjd@FreeBSD.org>によって書かれました。February 8, 2012 | FreeBSD |