Sequence Diagram

Menu

Perl (または 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 を参照。


Shinji KONO / Tue Dec 7 14:04:56 2021