Почему должен, ребенок vfork или ветвления называет _exit () вместо выхода ()?

Существует несколько инструментов там, которые позволяют Вам входить в систему и выполнять ряд команд на нескольких машинах одновременно. Вот пара:

12
12.06.2011, 14:52
4 ответа

Как замечено ранее, vfork не позволяет дочернему процессу получать доступ к памяти родителя. exit библиотечная функция C (вот почему, она часто пишется как exit(3)). Это выполняет различные задачи очистки, такие как сбрасывание и закрытие C потоки (файлы, открытые через функции, объявленные в stdio.h) и выполнение указанных пользователями функций, зарегистрированных с atexit. Все эти задачи включают чтение и запись в память процесса.

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

После fork, нет такого ограничения: родительский и дочерний процесс теперь абсолютно автономен.

11
27.01.2020, 19:55
  • 1
    vfork не позволяет дочернему процессу получать доступ к памяти родителя? Но я думал, что они совместно используют то же адресное пространство, таким образом, ребенок может получить доступ к родительскому адресному пространству. Это понимало неправильно? –  Sen 04.01.2011, 15:46
  • 2
    После ветвления нет такого ограничения: родительский и дочерний процесс теперь абсолютно автономен. Это означает, что я могу назвать выход () от ребенка ветвления? –  Sen 04.01.2011, 15:51
  • 3
    @Sen фигурных скобок: ребенку не разрешают получить доступ к памяти родителя. При попытке его это могло бы работать, потому что ядро не защитит Вас. Но эффект не мог бы быть тем, что Вы предназначаете; например, если Ваш компилятор решит оставить некоторое значение в регистре, то это не будет замечено родительским процессом. –  Gilles 'SO- stop being evil' 04.01.2011, 21:15
  • 4
    @Sen: После ветвления можно сделать выход вызова или любую другую функцию. Каждый процесс запускается после ветвления (на Linux, даже начальный процесс init разветвлен ядром). –  Gilles 'SO- stop being evil' 04.01.2011, 21:16

У Вас есть дочерний вызов _exit (), чтобы не сбрасывать stdio (или другой) буферы, когда дочерний процесс выходит. Так как дочерний процесс составляет точную копию родительского процесса, дочерний процесс все еще имеет то, что родитель имел в "stdout" или "stderr", буферах от <stdio.h>. Вы можете (и быть, в несвоевременные времена) получают двойные выводы путем вызова выхода (), один от atexit обработчиков дочернего процесса, и один от родителя, когда буферы в родительском процессе становятся полными, и сбрасываются.

Я понимаю вышеупомянутые концентраты ответа на stdio.h специфических особенностях, но та идея, вероятно, переносит на другой буферизированный ввод-вывод, как один из ответов выше указывает.

3
27.01.2020, 19:55

exit сделайте дополнительную очистку как вызывание функций, зарегистрированных atexit следовательно это данные доступа вне скопированной части. _exit выполняет syscall непосредственно w/out любая очистка кроме в ядре.

3
27.01.2020, 19:55
  • 1
    ... и нужно отметить, что ветвление () действительно копирует все, таким образом, Вы можете называть выход (), и можно определенно возвратиться из текущей функции. –  derobert 03.01.2011, 19:39

exit() :-выполняет некоторую задачу очистки, как закрытие i/o потоков и многих, и затем возвращается к ядру. _exit() :-непосредственно прибывает в ядро (не выполняйте задачу очистки).

fork() : у обоих родителей и ребенка есть другая таблица файлов, таким образом, изменение, сделанное ребенком, не влияет на параметры среды родителя, и наоборот.

vfork() : оба родителя и ребенок используют ту же таблицу файлов, таким образом, изменение, сделанное ребенком, влияет на параметры среды родителя. например, некоторая переменная var=10, теперь выполненный var++ ребенком и затем выполненным родителем, Вы видите эффект var++ в выводе родителя также.

Как я сказал, используете ли Вы exit() в vfork() затем весь i/o уже закрывается. Таким образом, даже если родитель работает правильно, Вы наклоняетесь способный получить надлежащий вывод, потому что все переменные сбрасываются, и все потоки закрываются.

1
27.01.2020, 19:55

Теги

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