exit()と_exit()の違い

_exit(2) と exit(3) の明確な違いは、終了時に atexit(3)on_exit(3) で登録した関数が呼ばれるかどうか。_exit は呼ばれないし exit は呼ばれる。

もう一つは、バッファされた標準入出力データを終了時にフラッシュするかどうか。exit では必ず flush され、_exit ではシステム依存だけれども、一般に flush されない。

たとえば、fork するとバッファされたデータが親から子にコピーされる。このデータを親子が flush すると、同じデータが重複して出力されてしまう。
この重複フラッシュ問題を回避するために、 子プロセスでは _exit(2) で抜けるのがお作法みたい。

ミニマムな再現コードは以下

import os
import sys
import time

sys.stdout.write('[before fork]')
pid = os.fork()
if pid > 0: # parent process
    sys.stdout.write('[parent process]')
    time.sleep(5)
    sys.exit(0)
else: # child process
    sys.stdout.write('[child process]')
    # sys.exit(0) # flushed twice !
    os._exit(0)

_exit すれば、出力内容は “[before fork][parent process]“となるし、exit すれば、子プロセスのフォーク前後のバッファが出力されるため、出力内容は “[before fork][child process][before fork][parent process]” となる。

Advertisements
Tagged with: , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: