私はBashに問題がありますが、その理由はわかりません。
Shellの下に、次のように入力します。
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid"は現在のpidを取得するCプログラムです。
int main() { printf("%d", (int)getpid()); return 0; }
私を混乱させるのはそれです:
手伝って頂けますか?
$$
は、サブシェル内の親のプロセスIDを返すように定義されています。 「特殊パラメータ」のmanページから:
$シェルのプロセスIDに展開されます。 ()サブシェルでは、サブシェルではなく現在のシェルのプロセスIDに展開されます。
bash
4では、BASHPID
を使って子のプロセスIDを取得できます。
~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
以下のいずれかを使用できます。
$!
は最後のバックグラウンドプロセスのPIDです。kill -0 $PID
は、まだ実行中かどうかを確認します。$$
は現在のシェルのPIDです。$$
は、Bashの 現在のスクリプトのPID のエイリアスです。 ここでの$$
と$BASHPID
の違い 、およびそのすぐ上のネストレベルを含む追加変数$BASH_SUBSHELL
を参照してください。CプログラムにシェルのPIDを表示させたい場合は、getppid()
を試してください。
既知のコマンドのPIDを取得する方法を尋ねているのであれば、次のようになります。
以下のコマンドを発行した場合#発行されたコマンドは***でした
dd if =/dev/diskx/=/dev/disky
それからあなたは使うでしょう:
PIDs=$(ps | grep dd | grep if | cut -b 1-5)
ここで何が起こるかというと、必要なすべての固有の文字をフィールドにパイプ処理して、そのフィールドを使用してエコーすることができます
$ PIDをエコー
正しいpidを取得するこの1つの方法
pid=$(cut -d' ' -f4 < /proc/self/stat)
同じニースはサブのために働いた
SUB(){
pid=$(cut -d' ' -f4 < /proc/self/stat)
echo "$$ != $pid"
}
echo "pid = $$"
(SUB)
出力を確認する
pid = 8099
8099 != 8100