コードから外部プログラムを実行する場合、次の 3 つのオプションがあります。
- の後は何もしないでください
fork()。外部プログラムは、その親のプロセス グループになります。 - などを呼び出し
setpgid(0, 0)て、外部プログラムが独自のプロセス グループを取得するようにします。 setsid()また、外部プログラムをその親の制御 tty から分離します。
上記の行動のうち、どの状況で正しいのはどれですか?
たとえば、vim と gnome-open を使用すると、おかしな動作が見られます。
- を実行する
:!gnome-open somefile.pdfと、PDF ビューアが起動し、すぐに戻ります。 - 次に、たとえば を実行し、
:!catcat の実行中にSIGQUITusing を送信しCTRL-\ます。
PDF ビューアがクラッシュします。これは、vim と gnome-open の両方が独自のプロセス グループでサブプロセスを生成しているように見えるために発生します。
バグと呼ぶには曖昧すぎるかもしれませんが、それでも誰のせいなのか疑問に思います: vim または gnome-open がsetpgidfork 後に呼び出されない理由はありますか? シェルが行うように? 起動元の端末から X アプリケーションを分離する代わりにgnome-openを呼び出す方が理にかなっているでしょうか? setsid(GLib がそのようなことを行うための標準的なクロスプラットフォームの方法を提供していないのは奇妙だと思います。)