プロセスグループを取得する
getpgrp
は、PID に指定したプロセスのプロセスグループ ID を返します。
現在のプロセスのプロセスグループ ID を取得したいなら、PID に 0
を指定します。
my $pgid = getpgrp(0);
なお、同じプロセスグループのプロセスは同じシグナルを同時に受けることができます。
通常、fork
で生成した子プロセスは、
親プロセスと同じプロセスグループ ID を持ちます。
次のサンプルコードは、まず自身のプロセスグループ ID と自身のプロセス ID を出力します。
そして、fork
で 3 つの子プロセスを生成します。
子プロセスでも、自身のプロセスグループ ID と自身のプロセス ID を出力します。
# 親プロセスのプロセスグループ ID と自身のプロセス ID
print 'Parent: getpgrp=', getpgrp(0), ', $$=', $$, "\n";
my @pids;
for ( my $i = 0 ; $i < 3 ; $i++ ) {
# 子プロセスをフォーク
$pids[$i] = fork();
# 子プロセスの処理
unless ( $pids[$i] ) {
sleep( $i + 1 );
print 'Child: getpgrp=', getpgrp(0), ', $$=', $$, "\n";
exit 0;
}
}
# すべての子プロセスが終了するのを待つ
for my $pid (@pids) {
waitpid( $pid, 0 );
}
上記コードを実行すると、次のような結果が出力されます。
Parent: getpgrp=104, $$=104
Child: getpgrp=104, $$=105
Child: getpgrp=104, $$=106
Child: getpgrp=104, $$=107
親プロセスと子プロセスすべてでプロセスグループ ID (104
) が同じことが分かります。
getpgrp
は Windows では利用できません。
"The getpgrp function is unimplemented" のようなエラーが出力されますので注意してください。