Вызов setpgid/setsid при порождении внешних программ

При запуске внешней программы из моего кода у меня есть три варианта:

  1. Ничего не делать после fork(), Внешняя программа будет находиться в группе процессов своего родителя.
  2. Вызов setpgid(0, 0) или аналогичный, поэтому внешняя программа получит свою собственную группу процессов.
  3. Вызов setsid(), который также отделяет внешнюю программу от родительского элемента управления tty.

Какое из перечисленных поведений является правильным в каких ситуациях?

Например, я вижу странное поведение с использованием vim и gnome-open:

  1. я бегу :!gnome-open somefile.pdf, который запускает просмотрщик PDF и сразу возвращается.
  2. Я тогда бегу, например, :!catи пока кошка бежит, отправьте SIGQUIT с помощью CTRL-\,

Программа просмотра PDF падает. Это происходит потому, что как vim, так и gnome-open порождают свои подпроцессы в своей собственной группе процессов.

Это может быть слишком неясным, чтобы называться ошибкой, но все же мне интересно, кто здесь виноват: есть ли причина для vim или gnome-open не вызывать setpgid после разветвления, как будет делать оболочка? Будет ли это иметь больше смысла для gnome-open звонить setsid вместо этого, чтобы отделить приложение X от терминала, с которого оно было запущено? (Мне кажется странным, что GLib не предлагает стандартный и кроссплатформенный способ делать такие вещи.)

0 ответов

Другие вопросы по тегам