how to exit a child process - _exit() vs. exit
Consider this code snippet:
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
How shall I exit the child process if execvp returns? Shall I use exit() or _exit()?
You should definitely use _Exit()
. exit()
calls the functions you added with atexit()
and deletes files created with tmpfile()
. Since the parent process is really the one that wants these things done when it exists, you should call _Exit()
, which does none of these.
Notice _Exit()
with a capital E. _exit(2)
is probably not what you want to call directly. exit(3)
and _Exit(3)
will call this for you. If you don't have _Exit(3)
, then yes, _exit()
is what you wanted.
The child of fork() should always call _exit().
Calling exit() instead is a good way to cause pending stdio buffers to be flushed twice.
execvp will exit the child if successfull so you don't have to exit.
On execve failure I simply use exit(EXIT_FAILURE);
in the child.
Edit : i found that after some research : http://www.unixguide.net/unix/programming/1.1.3.shtml
So it's looks like it's better to use _exit()
in a fork child specially when you are in C++ :p
Thanks for your question i learned something :D
It depends on the behavior you want: man -s 3 exit
and man _exit
for more details on your system. In general I believe the _exit doesn't run functions that are registered with atexit() whereas exit does (these functions better not call exit - otherwise you get recursion).
In general I would prefer exit over _exit except for in functions registered with atexit, in those I would call _exit, if needed.