Pythonで学ぶ「詳解 UNIXプログラミング」(その2) 第2章 UNIXの標準化と実装

2.1 sysconfとpathconfの定義値を出力する

import os, sys

for name in sorted(os.sysconf_names):
    try:
        value = os.sysconf(name)
    except OSError:
        value = "(not defined)"
        
    print name, value

for name in sorted(os.pathconf_names):
    try:
        value = os.pathconf(".", name)
    except OSError:
        value = "(not defined)"
        
    print name, value

プラットフォームで定義されている制限値の名称は、os.sysconf_namesos.pathconf_nameに定義されている。

ちなみに、os.sysconf_namesos.pathconf_namesは辞書オブジェクトだが、

sorted(os.pathconf_names)

でソートした辞書のキーの一覧を取得することができる。sorted()は指定したオブジェクトのイテレータを取得してからソートするので、上の式は

sorted(iter(os.pathconf_names))

と同じだ。辞書オブジェクトのイテレータは辞書のキーのみを返すので、結果として

sorted(os.pathconf_names.keys())

と書いたのと同じ結果が得られる。

2.2 パス名用領域の動的割り当て

import os, sys

PATHMAX_GUESS = 1024
_pathmax = None

def getmaxpath():
    global _pathmax
    if _pathmax is None:  # first time through
        try:
            _pathmax = os.pathconf("/", "PC_PATH_MAX")
            if _pathmax == -1:
                _pathmax = PATHMAX_GUESS
            else:
                _pathmax += 1
        except Exception:
            sys.exit("pathconf error for _PC_PATH_MAX")
    
    return _pathmax

手元の環境では、os.pathconf("/", "PC_PATH_MAX")は4096を返す。ってことは_pathmax += 1って不要なんじゃないだろうか。

2.3 ファイル記述子の個数の決定

import os, sys

OPENMAX_GUESS = 256
_openmax = None

def getmaxopen():
    global _openmax
    if _openmax is None:  # first time through
        try:
            _openmax = os.sysconf("SC_OPEN_MAX")
        except Exception:
            sys.exit("sysconf error for SC_OPEN_MAX")

        if _openmax == -1:
            _openmax = OPENMAX_GUESS
        else:
            _openmax += 1
    
    return _openmax

手元の環境では、getmaxopen()1025となった。