кто разветвляется, когда приложения дважды щелкают по Linux?

337
Anurag

Таким образом, я знаю, что когда в shell и я запускаю исполняемый файл, то shell разветвляет его на дочерний процесс, а затем exec для получения программы и памяти данных моего исполняемого файла. Так что, если моя оболочка теперь закрыта / закрыта, то все связанные с ней дочерние процессы также будут уничтожены.

Я читал, что в Linux каждый процесс создается с помощью fork () exec (). Мне любопытно, и мне было интересно, когда приложение запускается двойным щелчком по его значку, какой процесс forks () exec (), я понимаю, что это какой-то процесс ОС, мне было интересно, какой

Спасибо!

Ответ проследил это до / sbin / upstart

1
Я был бы признателен за причину отрицательного голосования, это подлинный вопрос, ответ на который я не смог найти в Интернете Anurag 7 лет назад 0
Я не голосовал, но могу вам сказать, что на ваш вопрос невозможно ответить, как написано в данный момент. Возможно, другие видят это так же. Я понятия не имею, что вы спрашиваете. Brick 7 лет назад 0
@ Брик спасибо! Я мог бы просто наполовину знать на этом этапе и, следовательно, неполноту вопроса. Я читал, что в Linux каждый процесс создается с помощью fork () exec (). Мне было интересно, когда приложение запускается двойным щелчком на его значке, какой процесс forks () exec () его, я понимаю, что это какой-то процесс ОС, мне было интересно, какой Anurag 7 лет назад 0
Тип `ps -fu `в командной строке. PID столбца - это идентификатор процесса в каждой строке. В столбце PPID указан номер родительского процесса. Brick 7 лет назад 0
@ Кирпич, я не думал об этом! Спасибо! Отследил это до / sbin / upstart, который является заменой для init Anurag 7 лет назад 1
Если этот ответ удовлетворительный, вы можете ответить на свой вопрос и принять его. Что касается убийства всех детей в случае смерти родителя, это не совсем так. Возможно иметь в системе процессы зомби и осиротевших. Хотя они должны (оптимально) быть редкими. Смотрите также [это] (http://linuxg.net/what-are-zombie-and-orphan-processes-and-how-to-kill-them/). Seth 7 лет назад 0
Да, это не совсем то, что запускает ваши приложения. Daniel B 7 лет назад 0
@ Вот и я только что прочитал об этом. Спасибо! Anurag 7 лет назад 0
@ DanielB, если я ошибаюсь, можешь направить меня? Anurag 7 лет назад 0
Обычно это оболочка вашего рабочего стола или что-то другое, где находятся значки, по которым вы дважды щелкаете. Попробуйте `htop`, он предлагает вид дерева. Daniel B 7 лет назад 0

1 ответ на вопрос

0
A. Loiseau

Прежде всего, немного терминологии .

Исполняемый файл - это простой файл в вашей системе. Процесс - это оболочка, которая выполняет программу, встроенную в исполняемый файл.


Вы правы относительно способа запуска исполняемого файла :

  1. Родительский процесс (уже живой) forkсам по себе, ведущий в двух потоках выполнения с этой точки. Один живет в родительском процессе, а другой - в новом новом процессе.
  2. Новый (дочерний) процесс отключает себя, чтобы выполнить программу исполняемого файла для запуска. Это делается с помощью системного вызова в execсемье.

На примере графического интерфейса, в котором вы дважды щелкаете значок исполняемого файла, ваш исполняемый файл разветвляется из процесса, показывая значок, на который вы щелкнули, в основном с этим исходным кодом:

const char *exe_path = taken_from_icon(); int pid = fork(); if(pid == 0) { // I am the new child execl(exe_path, exe_path, NULL); // exec only return in case of failure exit(EXIT_FAILURE); } // I am the graphical interface, // Continue and wait for another clic 

Но смерть и родительство ребенка не совсем так, как вы говорите.

В основном - и когда родительский процесс еще жив - дочерний процесс является дочерним по отношению к своему отцу (да! -). У него есть свой PPID (идентификатор родительского процесса), установленный на еще живой процесс, который его разветвил.

Все меняется, когда родительский процесс умирает. Дочерний процесс продолжает жить, но его PPID установлен на еще живущий процесс gran-parent. Всегда есть один, так как initпроцесс никогда не умирает.


Тот факт, что дочерние оболочки умирают, когда умирает сама оболочка, является чем-то конкретным. Я вижу две причины для этого:

  • Первый: оболочка обычно поддерживает список PID, которые она разветвляет. И когда оболочка умирает, она убивает их всех. Основные оболочки имеют disownвстроенную команду для удаления дочернего элемента из этого списка и оставления его в живых после смерти оболочки. Смотрите страницу руководства bash :

    Оболочка выходит по умолчанию при получении SIGHUP. Перед выходом интерактивная оболочка отправляет SIGHUP всем работам, запущенным или остановленным. Остановленные задания отправляются SIGCONT, чтобы гарантировать получение SIGHUP. Чтобы командная оболочка не отправляла сигнал на конкретное задание, его следует удалить из таблицы заданий с помощью встроенной команды disown (см. Ниже КОМАНДЫ СОСТАВЛЕНИЯ ОБОЛОЧКИ) или отметить, чтобы она не получала SIGHUP с помощью команды disown -h.

  • Второй: у дочерних оболочек обычно stdin, stdout и stderr связаны с самой оболочкой через каналы. Если оболочка перестает использовать дочерний стандартный вывод (часто для его печати) или закрывает конец канала, дочерний процесс может иметь ошибки при записи в стандартный вывод, которые могут заблокировать или уничтожить его.

Похожие вопросы