同じスクリプトの2つのコピーが実行されるように、特定の時点で分岐したいスクリプトがあります。
たとえば、次のbashスクリプトが存在すると予想します。
echo $$
do_fork()
echo $$
このbashスクリプトが存在する場合、予想される出力は次のとおりです。
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
または
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
この種の出力を取得したり、bashスクリプトにCと同様のフォークを実行させるために "do_fork()"の代わりに使用できるものはありますか?
ベストアンサー1
はい。フォークのスペルは次のとおりです&
。
echo child & echo parent
混乱する可能性があるのは、これが$$
シェルプロセスのPIDではなく、オリジナルシェルプロセス要点は、これが$$
シェルスクリプトの特定のインスタンスの一意の識別子であることです。これはスクリプトの実行中に変更されず、$$
同時に実行される他のスクリプトとは区別されます。シェルプロセスの実際のPIDを取得する1つの方法はsh -c 'echo $PPID'
。
シェルの制御フローはCとは異なります。 Cで書くなら
first(); fork(); second(); third();
その後、シェルに対応するものは次のとおりです。
after_fork () { second; third; }
first; after_fork & after_fork
単純なシェル型はfirst; child & parent
一般的なCイディオムに対応します。
first(); if (fork()) parent(); else child();
&
$$
すべてのBourneスタイルのシェルと(t)cshにこのように存在して動作します。$PPID
もともとBourneシェルにはありませんが、POSIX(したがってash、bash、ksh、zshなど)にはあります。