このBlogは移転しました。今後は aish.dev を御覧ください。

Pythonで学ぶ「詳解 UNIXプログラミング」(その7) 第7章 プロセスの環境

7.1 終了ハンドラの例

import atexit

def my_exit1():
    print "first exit handler"

def my_exit2():
    print "second exit handler"

atexit.register(my_exit2)
atexit.register(my_exit1)
atexit.register(my_exit1)

print "main is done"

Python 2.6以降では、atexit.register()をデコレータとして使用することもできる。

import atexit

@atexit.register
def my_exit1():
    print "first exit handler"

@atexit.register
def my_exit2():
    print "second exit handler"

print "main is done"

7.2 コマンド行の全ての引数を標準出力にエコーする

import sys
for i, arg in enumerate(sys.argv):
    print "argv[{0}]:{1}".format(i, arg)

7.3〜7.6 setjump/longjump

サンプル7.3〜7.6はsetjump()longjump()のサンプルだが、Pythonには存在しないため実装することはできない。例外処理のありがたみを噛みしめつつ、setjump()longjump()も忘れてしまおう。以下はC言語版をPythonの例外処理を用いて実装した例である。

def do_line(line):
    for tok in get_token():
        if tok is TOK_ADD:
            cmd_add()
        elif ...

def get_token():
    ''' fetch next token from global line string.'''
    global line
    ...
    ...

while True:
    line = raw_input()
    if not line:
        return
    try:
        do_line(line)
    except Exception, e:
        print "Error:", e

7.7 現在のリソースリミットを出力する

import resource

rnames = (
    'RLIMIT_AS', 'RLIMIT_CORE', 'RLIMIT_CPU', 'RLIMIT_DATA', 
    'RLIMIT_FSIZE', 'RLIMIT_MEMLOCK', 'RLIMIT_NOFILE', 
    'RLIMIT_NPROC', 'RLIMIT_OFILE', 'RLIMIT_RSS', 'RLIMIT_STACK',
    'RLIM_INFINITY')
    
for name in rnames:
    try:
        soft, hard = resource.getrlimit(getattr(resource, name))
    except ValueError:
        soft = hard = "n/a"
    else:
        if soft == -1: soft = "(infinity)"
        if hard == -1: hard = "(infinity)"
        
    print "{0:14} {1:>10}\t{2:>10}".format(name, soft, hard)