Perlで学ぶ「詳解 UNIXプログラミング」(その7) 第7章 プロセスの環境
はじめに
「詳解 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プログラミング」の第七章を示しました。