kill() - プロセスへのシグナルの送信
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1
XPG4 XPG4.2 Single UNIX Specification、バージョン 3 |
両方 | POSIX(ON)
|
形式
#define _POSIX_SOURCE
#include <signal.h>
int kill(pid_t pid, int sig);
機能説明
プロセスまたはプロセス・グループにシグナルを送信します。プロセスは、送信側の実ユーザー ID または有効なユーザー ID が、意図される受信側の実ユーザー ID または有効なユーザー ID と一致する場合に、シグナルを送信する許可を持ちます。プロセスは、適切な権限を持っている場合にも、シグナルを送信することができます。_POSIX_SAVED_IDS が unistd.h ヘッダー・ファイル内に定義されている場合、意図される受信側の保管された設定ユーザー ID が、有効なユーザー ID の代わりに チェックされます。
ユーザー ID にかかわらず、プロセスは、送信側と同じセッション (同じセッション ID) の
メンバーであるプロセスに対しては、いつでも SIGCONT
シグナルを
送信できます。
signal() または sigaction() を使用すると、kill() が呼び出された場合の シグナルの対処方法を指定することができます。
プロセスは kill() を使用して、プロセス自身にシグナルを送信できます。シグナルがブロックも無視もされない場合、kill() が戻る前に、保留中でブロックされていないシグナルが 1 つ以上送信側へ送達されます。保留中のブロックされていないシグナルがほかにない場合、届けられるシグナルは sig になります。
pid を使って、これらのプロセスを指定することができます。
pid_t
pid;- 呼び出し側がシグナルを送信したいプロセスを指定します。
- pid が 0 より大きい場合、kill() はそのシグナルを pid と等しい ID のプロセスに送信します。
- pid が 0 に等しい場合、kill() はそのシグナルを プロセス・グループ ID が送信側のものと一致するプロセスすべてに送信しますが、送信側がシグナルを送信する権限を持っていないプロセスに対しては、シグナルは送信されません。
- pid が -1 の場合、kill() は -1 を戻します。
- XPG4.2 の特殊な動作: pid が -1 の場合、kill() は、送信側がシグナルを送信する権限を持っていないプロセスを除くすべてのプロセスに、シグナル sig を送信します。
- pid が -1 未満の場合、kill() はそのシグナルを プロセス・グループ ID が pid の絶対値と等しいプロセスすべて に送信しますが、送信側がシグナルを送信する権限を持っていないプロセス に対しては、シグナルは送信されません。
int
sig;- pid によって指定されるプロセスに対して送信されるシグナルです (シグナルのリストは、表 1 を参照してください)。 これは 0 または signal.h ヘッダー・ファイルに定義されているシグナルの いずれかでなくてはいけません。sig が 0 の場合、kill() はエラー検査を行いますが、シグナルを送信しません。pid 引数が正しいかどうかチェックするために、sig を 0 にすることができます。
この関数がサポートされるのは、POSIX プログラムだけです。 SIGIOERR を渡すために使用できます。
使用上の注意
この関数では、SIGTHSTOP
および SIGTHCONT
シグナルの使用はサポートされていません。
戻り値
kill() は、pid が指定するプロセスのいずれかに sig を送信する許可を持っている場合、0 を戻します。
kill() がシグナルの送信に失敗した場合は、-1 が戻され、errno が次のいずれかの値に設定されます。
- エラー・コード
- 説明
- EINVAL
- sig の値が正しくない、またはサポートされたシグナルの番号 ではありません。
- EPERM
- 呼び出し側が、pid によって指定されるどのプロセスに対してもシグナルを送信する許可を持っていません。
- ESRCH
- pid に対応するプロセスまたはプロセス・グループが存在しません。
例
CELEBK01
/* CELEBK01 */
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h> /*FIX: used to be <wait.h>*/
main() {
sigset_t sigset;
int p[2], status;
char c='z';
pid_t pid;
if (pipe(p) != 0)
perror("pipe() error");
else {
if ((pid = fork()) == 0) {
sigemptyset(&sigset);
puts("child is letting parent know he's ready for signal");
write(p[1], &c, 1);
puts("child is waiting for signal");
sigsuspend(&sigset);
exit(0);
}
puts("parent is waiting for child to say he's ready for signal");
read(p[0], &c, 1);
puts("child has told parent he's ready for signal");
kill(pid, SIGTERM);
wait(&status);
if (WIFSIGNALED(status))
if (WTERMSIG(status) == SIGTERM)
puts("child was ended with a SIGTERM");
else
printf("child was ended with a %d signal¥n", WTERMSIG(status));
else puts("child was not ended with a signal");
close(p[0]);
close(p[1]);
}
}
出力:
parent is waiting for child to say he's ready for signal
child is letting parent know he's ready for signal
child is waiting for signal
child has told parent he's ready for signal
child was ended with a SIGTERM
関連情報
- signal.h — 例外処理
- unistd.h — インプリメンテーション固有関数
- bsd_signal() - signal() の BSD バージョン
- getpid() - プロセス ID の取得
- killpg() - プロセス・グループへのシグナル送信
- pthread_kill() - スレッドへのシグナル送信
- raise() - シグナルの起動
- setsid() - セッションの作成、プロセス・グループ ID の設定
- sigaction() - シグナル・アクションの検査/変更
- sighold() - スレッドへのシグナルの追加
- sigignore() - シグナルを無視する後処理の設定
- signal() - 割り込みの処理
- sigprocmask() - スレッドの検査または変更
- sigrelse() - スレッドからのシグナルの除去
- sigset() - シグナル・アクションまたはスレッドの変更