Вызов setpgid/setsid при порождении внешних программ
При запуске внешней программы из моего кода у меня есть три варианта:
- Ничего не делать после
fork()
, Внешняя программа будет находиться в группе процессов своего родителя. - Вызов
setpgid(0, 0)
или аналогичный, поэтому внешняя программа получит свою собственную группу процессов. - Вызов
setsid()
, который также отделяет внешнюю программу от родительского элемента управления tty.
Какое из перечисленных поведений является правильным в каких ситуациях?
Например, я вижу странное поведение с использованием vim и gnome-open:
- я бегу
:!gnome-open somefile.pdf
, который запускает просмотрщик PDF и сразу возвращается. - Я тогда бегу, например,
:!cat
и пока кошка бежит, отправьтеSIGQUIT
с помощьюCTRL-\
,
Программа просмотра PDF падает. Это происходит потому, что как vim, так и gnome-open порождают свои подпроцессы в своей собственной группе процессов.
Это может быть слишком неясным, чтобы называться ошибкой, но все же мне интересно, кто здесь виноват: есть ли причина для vim или gnome-open не вызывать setpgid
после разветвления, как будет делать оболочка? Будет ли это иметь больше смысла для gnome-open
звонить setsid
вместо этого, чтобы отделить приложение X от терминала, с которого оно было запущено? (Мне кажется странным, что GLib не предлагает стандартный и кроссплатформенный способ делать такие вещи.)