кто делает форк при двойном щелчке по приложениям в Linux?

кто делает форк при двойном щелчке по приложениям в Linux?

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

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

Спасибо!

Отвечать отследил его до /sbin/upstart

решение1

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

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


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

  1. Родительский процесс (уже живой)forks сам по себе, ведущий к двум потокам выполнения из этой точки. Один из них находится в родительском процессе, а другой — в новом процессе.
  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 устанавливается на все еще живой родительский процесс. Всегда есть один, поскольку initпроцесс никогда не умирает.


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

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

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

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

Связанный контент