読者です 読者をやめる 読者になる 読者になる

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

perl unix APUE

はじめに

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

7.1 終了ハンドラの例

Perlには atexitはなく、ENDブロックを使います。

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

# 終了ハンドラの例

sub my_exit1 {
    print "first exit handler\n";
}

sub my_exit2 {
    print "second exit handler\n";
}

END {
    my_exit1();
    my_exit2();
}

print "main is done\n"

上記の結果

  % perl 7_1.pl
  main is done
  first exit handler
  second exit handler

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

@ARGVにはコマンド名自身が含まれていませんので注意。

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

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

my @args = @ARGV;
{
    local @ARGV = @args;

    unshift @ARGV, $0;
    my $length = scalar @ARGV;
    for my $i (0..($length-1)) {
        printf "argv[%d]:%s\n", $i, $ARGV[$i];
    }
}

7.3〜7.6 setjump/longjump

大域脱出ですね。setjumpでコンテキストを保存して、longjumpでそれを戻して
スタックを巻き戻すという。Cより高レベルな言語であれば try, catch的な
もので実現されています。モダンな Perlであれば Try::Tinyでよいでしょう。


以下は最近はまった必ず例外が投げられる例です。

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

use Try::Tiny;
use Furl;

# setjump/longjump

my $furl = Furl->new( timeout => 10 );
try {
    $furl->get("http://a_a.example.com");
} catch {
    print "Catch exception: $_"
} finally {
    undef $furl;
    print "Clean up\n";
};

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

標準的に使える getrlimitがなかったので、BSD::Resourceという
モジュールをインストールして使いました。

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

use BSD::Resource;

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

my @limit_constants = qw(
    RLIMIT_AS RLIMIT_CORE RLIMIT_CPU RLIMIT_DATA
    RLIMIT_FSIZE RLIMIT_MEMLOCK RLIMIT_NOFILE
    RLIMIT_NPROC RLIMIT_OFILE RLIMIT_RSS RLIMIT_STACK
);

printf "%-15s %10s %10s\n", "NAME", "SOFT", "HARD";
for my $name (@limit_constants) {
    my ($soft, $hard) = getrlimit($name);

    unless (defined $soft && defined $hard) {
        $soft = $hard = "n/a";
    }

    $soft = "infinity" if $soft == -1;
    $hard = "infinity" if $hard == -1;

    printf "%-15s %10s %10s\n", $name, $soft, $hard;
}

結果は以下のようになりました。

  % perl 7_7.pl
  NAME                  SOFT       HARD
  RLIMIT_AS         infinity   infinity
  RLIMIT_CORE              0   infinity
  RLIMIT_CPU        infinity   infinity
  RLIMIT_DATA       infinity   infinity
  RLIMIT_FSIZE      infinity   infinity
  RLIMIT_MEMLOCK       65536      65536
  RLIMIT_NOFILE         1024       1024
  RLIMIT_NPROC      infinity   infinity
  RLIMIT_OFILE          1024       1024
  RLIMIT_RSS        infinity   infinity
  RLIMIT_STACK       8388608   infinity

まとめ

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