0

このコマンドを理解するのに問題があります:ターミナルmkfifo pipe1mkfifo pipe2 実行して実行した後:

  1. $ echo -n x | cat - pipe1 > pipe2 &

    私は結果として得ます:

    [1] 3526
    

    時間の経過とともに増加傾向にある数字。

    私が実行すると:

  2. $ cat <pipe2 > pipe1

    出力は次のとおりです。

    $ echo -n x | cat - pipe1 > pipe2 &
    

誰かが何が起こっているのか説明できますか?

  1. 私の知る限り、最初のコマンドはパイプ2にx + pipe1コンテンツを含む新しいファイルを作成する必要があり、その出力は何ですか?mkfifoで作成されたためにパイプ2が既に存在する場合、どうすればよいですか?
  2. 2番目のコマンドが何をするのかわかりません。オンラインで参照が見つかりません。

これは宿題で、まだクラスを見ていません。任意の助けをいただければ幸いです。

4

1 に答える 1

5

各コマンド:

echo -n x | cat - pipe1 > pipe2 &

echoの出力がパイプされるようにコマンド シーケンスcatを実行しますが、シーケンスはバックグラウンドで実行されます。シェルは次のようなメッセージを生成します。

[1] 3526

バックグラウンド ジョブがジョブ ID 1 でプロセス ID が 3526 であることを示します。FIFO の性質上、サブシェルは全体としてハングアップし、操作pipe2を正常に起動する前に読み取り用に何かが開かれるのを待機しcatます。解放されると、catコマンドは標準入力から 1 文字を読み取り、からの入力を待機してハングしますpipe1。つまり、プロセスがpipe2書き込みのために開くのを待ちます。

ジョブ番号とプロセス ID は一意であるため、コマンドを繰り返すと番号が増加します。

cat pipe1単独でハングする必要があります。エコーされたコマンドは、以前のコマンドの完了からのものである可能性があります。

$ echo -n x | cat - pipe1 > pipe2 &
[1] 9304
$ (echo Hi > pipe1) &
[2] 9305
$ sleep 3
$ jobs
[1]-  Running                 echo -n x | cat - pipe1 > pipe2 &
[2]+  Running                 ( echo Hi > pipe1 ) &
$ cat pipe2
-n x
Hi
[1]-  Done                    echo -n x | cat - pipe1 > pipe2
[2]+  Done                    ( echo Hi > pipe1 )
$

echo -n私のシェル (Korn) はあなたのものと同じように解釈しません(おそらくbash)。

于 2012-11-24T03:45:49.043 に答える