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