Sequence Diagram
MenuPerl (または Ruby/Python/Java ) による shell に沿って、shell のコマンドの組み合わせをfork/exec 実現する Perl のscript を作成せよ。
例えば、
ls ; ls ..
は以下のようになる。
#!/usr/bin/perl
$|=0;
if (fork) {
# parent
print "Parent $$\n";
# 子供が終わるのを待つ
wait;
print "Child end\n";
} else {
# child
print "Child $$\n";
my @command = split;
# exec @command;
exec "/bin/ls";
print "Child end\n";
}
if (fork) {
# parent
print "Parent $$\n";
# 子供が終わるのを待つ
wait;
print "Child end\n";
} else {
# child
print "Child $$\n";
my @command = split;
# exec @command;
exec "/bin/ls ..";
print "Child end 1234\n";
}
これを、
ls ; ls .. ; ls ../..
ls ; ( ls & ls ../.. )
ls ; ( ls | wc )
などでやってみる。
pipe は、
pipe READHANDLE,WRITEHANDLE
を closeと dup を使う。 (Perlでは dup に open を使う perldoc -f open )
これらの実行を、Astah の sequence diagram を使って記述せよ。
system("ls ; ( ls | wc )");
は内部で /bin/sh を読み出してしまうので、sh のコマンド実行シーケンスを理解する課題として無意味になってしまう。
exec("ls ; ( ls | wc )");
でも同じ。perldoc -f exec を参照。