kill -0 <PID> は何をするのでしょうか？


`kill -0` という手段を初めて知ったので、`kill -0` の用途を質問させてください。

[kill](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/kill.2.html) の man
には以下のように書かれています。

> sig に 0 を指定した場合、シグナルは送られないが、 エラーのチェックは行われる。これを使って、プロセス ID や プロセスグループ ID
> の存在確認を行うことができる。

プロセスを制御する手段として、おなじみなのは、PID をファイルに保存しておき、プロセスを終了させたいときは PID ファイルの中身の PID を指定して
kill するというものです。

たとえばプロセス foobar を以下のように起動させて

[code]

    foobar &
    echo $! > foobar.pid
    
[/code]

終了させるとき

[code]

    kill -9 $(cat foobar.pid)
    
[/code]

ここではシグナル 9 を送信( `kill -9` )していますが、冒頭に引用したように、シグナル 0 を送信( `kill -0`
)することもできるようです。

`kill -0` の用途としては、以下のような理解であっているでしょうか？

プロセス foobar の状態と foobar.pid ファイルの存在有無は関係が無い。つまり、foobar.pid
ファイルが存在していたとしても、それがプロセス foobar が走っているという保証にはならない。ゆえに、プロセス foobar の状態を確認するために
kill -0 を用いる。




おおむね、その理解でよろしいかと存じますが、少し指摘をさせていただきます。

まず、プロセスIDは使い回される場合があり、通常はインクリメントで増えていきますが、 `/proc/sys/kernel/pid_max`
で定義される最大値を超えるとこれまでに使ったプロセスIDを利用した別のプロセスが実行される場合が有り、pidファイルに記載されたプロセスが走っている保証にはなりません。

また、sig 0についてですが、kill from util-linux 2.33.1 の`man 2 kill`
によると、以下のとおりになり、記載された内容とは異なります。

> If sig is 0, then no signal is sent, but existence and permission checks are
> still performed; this can be used to check for the existence of a process ID
> or process group ID that the caller is permitted to signal.
>
> sig に 0 を指定した場合、シグナルは送られないが、 プロセスの存在と権限のチェックは行われる。これを使って、送信者がシグナルを送信できるプロセス
> ID や プロセスグループ ID の存在確認を行うことができる。

という訳で、`kill` の権限があるかどうかの確認に使うことも可能そうです。




おおむね、その理解でよろしいかと存じますが、少し指摘をさせていただきます。

まず、プロセスIDは使い回される場合があり、通常はインクリメントで増えていきますが、 `/proc/sys/kernel/pid_max`
で定義される最大値を超えるとこれまでに使ったプロセスIDを利用した別のプロセスが実行される場合が有り、pidファイルに記載されたプロセスが走っている保証にはなりません。

また、sig 0についてですが、kill from util-linux 2.33.1 の`man 2 kill`
によると、以下のとおりになり、記載された内容とは異なります。

> If sig is 0, then no signal is sent, but existence and permission checks are
> still performed; this can be used to check for the existence of a process ID
> or process group ID that the caller is permitted to signal.
>
> sig に 0 を指定した場合、シグナルは送られないが、 プロセスの存在と権限のチェックは行われる。これを使って、送信者がシグナルを送信できるプロセス
> ID や プロセスグループ ID の存在確認を行うことができる。

という訳で、`kill` の権限があるかどうかの確認に使うことも可能そうです。

