プロセスグループについてAPUEを読んでいます。その本は言う、
ほとんどのジョブ制御シェルでは、この関数 ( setpgid ) はforkの後に呼び出され、子に独自のプロセス グループ ID を設定させます。これらの呼び出しの 1 つは冗長ですが、両方を行うことで、いずれかのプロセスがこれが発生したと想定する前に、子プロセスが独自のプロセス グループに配置されることが保証されます。
私の理解を確認するために、次のコードを書きました。エラー処理は省略しています。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("process ID: %d\n", getpid());
printf("process group ID: %d\n", getpgrp());
exit(0);
}
出力 (シェルに直接実行):
プロセス ID: 4388
プロセス グループ ID: 4388
出力 (vim 内で実行):
process ID: 4401
process group ID: 4400 // pid of vim (through ps)
結果が異なるのはなぜですか?コマンドを実行するためにvimはシェルをフォークしませんか? もしそうなら、違いは何ですか、つまり、最初の出力のようにプロセスグループ ID がプロセス ID と等しくないのはなぜですか?
ところで、forkは常に子プロセスのプロセス グループ ID を自動的に設定しますか? 設定する前に子プロセスのプロセス グループ ID を出力しようとすると、親プロセスのプロセス ID が出力されました。
どうもありがとう。