94

Please help me in clarifying the concept of these two python statements in terms of difference in functionality:

  1. sys.exit(0)

  2. os._exit(0)

Alois Mahdal
  • 10,763
  • 7
  • 51
  • 69
Aamir Rind
  • 38,793
  • 23
  • 126
  • 164

3 Answers3

92

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().

NPE
  • 486,780
  • 108
  • 951
  • 1,012
52

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

prelic
  • 4,450
  • 4
  • 36
  • 46
8

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

minglyu
  • 2,958
  • 2
  • 13
  • 32
  • "This ensures that only one process calls exit handlers and flushes stdio buffers, which is usually desirable" Why is that desirable? – Tan Wang Jan 07 '23 at 23:31
  • Doesn't each program have its own stdio buffer? Why would not flushing the stdio buffers of the child processes be a good thing? – Tan Wang Jan 07 '23 at 23:32