Sys.exit (0)和 os._exit (0)之间的区别是什么

请帮助我澄清这两个 python 语句在功能上的差异:

  1. sys.exit(0)

  2. os._exit(0)

105356 次浏览

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