Подтвердить что ты не робот

Как выйти из дочернего процесса - _exit() vs. exit

Рассмотрим этот фрагмент кода:

pid_t cpid = fork();

if (cpid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
}

if (cpid == 0) { // in child
    execvp(argv[1], argv + 1);
    perror("execvp");
    _exit(EXIT_FAILURE);
}

// in parent

Как выйти из дочернего процесса, если execvp вернется? Должен ли я использовать exit() или _exit()?

4b9b3361

Ответ 1

Вы должны обязательно использовать _Exit(). exit() вызывает функции, добавленные с помощью atexit(), и удаляет файлы, созданные с помощью tmpfile(). Поскольку родительский процесс действительно тот, кто хочет, чтобы эти вещи выполнялись, когда он существует, вы должны вызвать _Exit(), который ничего не делает.

Обратите внимание на _Exit() с капиталом E. _exit(2), вероятно, не то, что вы хотите вызвать напрямую. exit(3) и _Exit(3) вызовет это для вас. Если у вас нет _Exit(3), тогда да, _Exit() - это то, что вы хотели.

Ответ 2

Ребенок fork() всегда должен вызывать _exit().

Вызов exit() вместо этого - хороший способ заставить сброшенные буферы stdio дважды удаляться.

Ответ 3

execvp выйдет из дочернего элемента, если вам не удастся выполнить его.

При ошибке execve я просто использую exit(EXIT_FAILURE); в дочернем элементе.

Изменить: я обнаружил, что после некоторых исследований: http://www.unixguide.net/unix/programming/1.1.3.shtml

Таким образом, лучше использовать _exit() в ребенке fork специально, когда вы находитесь на С++: p Спасибо за ваш вопрос, я кое-что узнал: D

Ответ 4

Это зависит от поведения, которое вы хотите: man -s 3 exit и man _exit для получения более подробной информации о вашей системе. В общем, я считаю, что _exit не запускает функции, которые зарегистрированы с помощью atexit(), тогда как exit (эти функции лучше не вызывают exit - в противном случае вы получаете рекурсию).

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

Ответ 5

exit() - функция ANSI-C, поэтому она не зависит от операционной системы. Он закрывает все стандартные функции ANSI-C. _exit() вызывается exit(), чтобы закрыть функциональность, зависящую от операционной системы, потому что exit() понятия не имеет о них. (exit не зависит от операционной системы)