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

はじめに

「詳解 UNIXプログラミング」の第二章を示します。

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

Perlでは Pythonの os.sysconf_namesとos.pathconf_nameのようなものがない
ので、C言語の場合と同様に sysconf、pathconfを使って一つずつ値を取得する
しかありません。各定数はシンボルテーブルを操作して取得できます。
かなり強引ですが、無理やり書くと以下のようになりました。

#!/usr/bin/env perl
use strict;
use warnings;

use POSIX;

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

print "sysconf:\n";
for my $key (%POSIX::) {
    next unless $key =~ m{^_SC_}xms;

    {
        no strict "refs";

        my $val = POSIX::sysconf( &{"POSIX::$key"} );
        if (defined $val) {
            print "$key, $val\n";
        } else {
            print "$key (undefined)\n"
        }
    }
}
print "\n";

print "pathconf:\n";
for my $key (%POSIX::) {
    next unless $key =~ m{^_PC_}xms;

    {
        no strict "refs";
        my $val = POSIX::pathconf("/", &{"POSIX::$key"});
        if (defined $val) {
            print "$key, $val\n";
        } else {
            print "$key (undefined)\n"
        }
    }
}

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

Python版を見たとき何をしたいプログラムか意味がわからなかったのですが、
原著を読んでみると、C言語でパス名を格納する場合にどれだけ mallocしたら
いいかという場合に使うプログラムでした。

#!/usr/bin/env perl
use strict;
use warnings;

use POSIX;
use constant PATHMAX_GUESS => 1024;

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

my $_path_max;

sub get_max_path {
    unless (defined $_path_max) {
        $_path_max = POSIX::pathconf("/", &POSIX::_PC_PATH_MAX);
        if (defined $_path_max) {
            $_path_max += 1;
        } else {
            $_path_max = PATHMAX_GUESS;
        }
    }

    return $_path_max;
}

printf "PATHMAX = %d\n", get_max_path();

Pythonとほぼ同じですね。

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

openできるファイルの上限を知るというものですね。
これも Pythonとほぼ変わりませんね。

#!/usr/bin/env perl
use strict;
use warnings;

use POSIX;
use constant OPENMAX_GUESS => 256;

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

my $_open_max;

sub get_max_open {
    unless (defined $_open_max) {
        $_open_max = POSIX::sysconf(&POSIX::_SC_OPEN_MAX);
        if (defined $_open_max) {
            $_open_max += 1;
        } else {
            $_open_max = OPENMAX_GUESS;
        }
    }

    return $_open_max;
}

printf "OPENMAX = %d\n", get_max_open();

まとめ

詳解 UNIXプログラミングの第2章を示しました。
今回は C書いてるのとほとんど変わらないなぁという印象。