「独自のプロセスグループでプロセスを開始する」とはどういう意味ですか?シェルは、独自のプロセス グループでプロセスを起動します。これが、ジョブ制御を行う方法です (フォアグラウンドでプロセスのプロセス グループを作成し、バックグラウンドで起動されるすべてのパイプラインに対して複数のプロセス グループを作成することにより)。
シェルがパイプラインごとに新しいプロセス グループを起動することを確認するには、次のようにします。
ps fax -o pid,pgid,cmd | less
次のように表示されます:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
シェルがパイプライン用の新しいプロセス グループを作成し、パイプライン内のすべてのプロセスがプロセス グループを共有していることに注意してください。
編集:
私はあなたが何を得ているか知っていると思います。 system
を呼び出しています パールから。どうやら、sh -c
ジョブ制御のないシェルであるため、新しいプロセス グループを作成しません。
私なら fork
にします 、次に子で:
setpgrp;
system("ps fax -o pid,pgid,cmd");
と wait
編集:setid を使用したいが、結果のプロセスのセッション ID および/または pid を見つけたい場合:
setsid コマンドを使用してプロセスを起動すると、端末にアタッチされないため、もちろん ctrl-c には応答しません。
の出力を grep することで見つけることができます
ps x -O sid
またはもっと限定的なもの
ps x -o %c,%p,sid
または、すべてのエントリの proc/[pid]/stat を単純にトローリングし、セッション ID とその他の関心のあるものを調べます (詳細については、man proc を参照してください)。
setsid の man ページには、出力を直接生成するためのフラグはありませんが、標準を変更することで、目的の情報を出力する独自のバージョンを簡単に作成できます。
たとえば、
の結果の 1 つから setsid.c のコピーを取得します。http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
nls インクルード、ロケール関連、および問題を引き起こす _("") エラー マクロをコメント アウトし、execvp 行の直前にこれを追加します。
printf("process will be pid %d sid %d\n", getpid(), getsid(0));