2

コードから外部プログラムを実行する場合、次の 3 つのオプションがあります。

  1. の後は何もしないでくださいfork()。外部プログラムは、その親のプロセス グループになります。
  2. などを呼び出しsetpgid(0, 0)て、外部プログラムが独自のプロセス グループを取得するようにします。
  3. setsid()また、外部プログラムをその親の制御 tty から分離します。

上記の行動のうち、どの状況で正しいのはどれですか?

たとえば、vim と gnome-open を使用すると、おかしな動作が見られます。

  1. を実行する:!gnome-open somefile.pdfと、PDF ビューアが起動し、すぐに戻ります。
  2. 次に、たとえば を実行し、:!catcat の実行中にSIGQUITusing を送信しCTRL-\ます。

PDF ビューアがクラッシュします。これは、vim と gnome-open の両方が独自のプロセス グループでサブプロセスを生成しているように見えるために発生します。

バグと呼ぶには曖昧すぎるかもしれませんが、それでも誰のせいなのか疑問に思います: vim または gnome-open がsetpgidfork 後に呼び出されない理由はありますか? シェルが行うように? 起動元の端末から X アプリケーションを分離する代わりにgnome-openを呼び出す方が理にかなっているでしょうか? setsid(GLib がそのようなことを行うための標準的なクロスプラットフォームの方法を提供していないのは奇妙だと思います。)

4

0 に答える 0