What is difference between sys.exit(0) and os._exit(0)
Question:
Please help me in clarifying the concept of these two python statements in terms of difference in functionality:
-
sys.exit(0)
-
os._exit(0)
Answers:
According to the documentation:
os._exit():
Exit the process with status n, without calling cleanup handlers, flushing stdio buffers, etc.
Note The standard way to exit is sys.exit(n)
. _exit()
should normally only be used in the child process after a fork()
.
os._exit
calls the C function _exit()
which does an immediate program
termination. Note the statement “can never return”.
sys.exit()
is identical to raise SystemExit()
. It raises a Python
exception which may be caught by the caller.
Original post: http://bytes.com/topic/python/answers/156121-os-_exit-vs-sys-exit
Excerpt from the book "The linux Programming Interface":
Programs generally don’t call _exit()
directly, but instead call the exit()
library function,
which performs various actions before calling _exit()
.
- Exit handlers (functions registered with
at_exit()
and on_exit()
) are called, in
reverse order of their registration
- The stdio stream buffers are flushed.
- The
_exit()
system call is invoked, using the value supplied in status.
Could someone expand on why _exit()
should normally only be used in the child process after a fork()?
Instead of calling exit()
, the child can call _exit()
, so that it doesn’t flush stdio
buffers. This technique exemplifies a more general principle: in an application
that creates child processes, typically only one of the processes (most often the
parent) should terminate via exit()
, while the other processes should terminate
via _exit()
. This ensures that only one process calls exit handlers and flushes
stdio buffers, which is usually desirable
Please help me in clarifying the concept of these two python statements in terms of difference in functionality:
-
sys.exit(0)
-
os._exit(0)
According to the documentation:
os._exit():
Exit the process with status n, without calling cleanup handlers, flushing stdio buffers, etc.
Note The standard way to exit is
sys.exit(n)
._exit()
should normally only be used in the child process after afork()
.
os._exit
calls the C function _exit()
which does an immediate program
termination. Note the statement “can never return”.
sys.exit()
is identical to raise SystemExit()
. It raises a Python
exception which may be caught by the caller.
Original post: http://bytes.com/topic/python/answers/156121-os-_exit-vs-sys-exit
Excerpt from the book "The linux Programming Interface":
Programs generally don’t call _exit()
directly, but instead call the exit()
library function,
which performs various actions before calling _exit()
.
- Exit handlers (functions registered with
at_exit()
andon_exit()
) are called, in
reverse order of their registration - The stdio stream buffers are flushed.
- The
_exit()
system call is invoked, using the value supplied in status.
Could someone expand on why _exit()
should normally only be used in the child process after a fork()?
Instead of calling exit()
, the child can call _exit()
, so that it doesn’t flush stdio
buffers. This technique exemplifies a more general principle: in an application
that creates child processes, typically only one of the processes (most often the
parent) should terminate via exit()
, while the other processes should terminate
via _exit()
. This ensures that only one process calls exit handlers and flushes
stdio buffers, which is usually desirable