Вы можете использовать _exit
или exit
, но не следует использовать return
.Когда вы разветвляете дочерний элемент, вы сохраняете весь стек вызовов как часть разветвления дочернего элемента.Поэтому, если вы используете return
, вы в конечном итоге вернетесь к своей программе, продолжая выполнять другие задачи, что почти наверняка не то, что вам нужно.
Например, если у вас есть что-токак этот фрагмент:
int get_value()
{
pid_t pid;
if (!(pid = fork())) {
int x = 0;
// do something with x.
exit(x);
}
else {
int status;
wait(&status);
return status;
}
}
int main()
{
int value = get_value();
switch (get_value()) {
case 0:
// call f
break;
case 255 << 8:
// call g
break;
}
}
вы можете в конечном итоге вызвать f
или g
или выполнить другую работу с return
, что определенно нежелательно.
Если вы вызываете _exit
, функции, зарегистрированные с помощью atexit
, не вызываются.Это правильная вещь в многопоточных средах.Если вы не работаете в многопоточной среде и у вас нет обработчиков, зарегистрированных с помощью atexit
, то они должны быть функционально эквивалентны.
Если вы хотите, чтобы деструкторы в вашем дочернем процессе вызывались, поместитекод дочернего процесса в его собственной функции и позволяет его переменным автоматически уничтожаться, когда они выходят из области видимости.exit
не будет уничтожать объекты для вас, что хорошо, потому что обычно вы не хотите уничтожать объекты, созданные в родительском процессе в вашем дочернем процессе.