0

セミコロンで区切られた 1 行ではなく、2 つのコマンドを次々に発行するとどうなるかを観察してください。

パイプを作成してムービーを起動:

$ mkfifo pipe1
$ tail -f /dev/null > pipe1 &
$ cat pipe1 | omxplayer /path/to/video.mp4

トライアル 1 を終了します。

$ echo -n q > pipe1; # Exits movie, but omxplayer hangs
$ echo > pipe1; # Completes exit process

トライアル 2 を終了します。

$ echo -n q > pipe1; echo > pipe1 # Does nothing

トライアル 3 を終了します。

$ echo -n q > pipe1; sleep 1; echo > pipe1 # Works just like trial 1

トライアル 2 が何もしない理由を誰かが説明してくれませんか。echoまた、2 つのステートメントを必要としない、名前付きパイプを介して終了コマンドを発行するより良い方法はありますか?

4

3 に答える 3

2

fifo の最後のライターが停止し、リーダーが fifo をチェックすると、ファイルの終わりが表示されます。リーダーがチェックする前に新しいライターが再び存在する場合、リーダーはファイルの終わりを認識しません。あなたのリーダー(omxplayer)がファイルの終わりをチェックしていると思います。

読者の視点から言えば、omxplayerそれは見る

  1. "q" EOF ... <LF> EOF
  2. "q"(EOFおそらく見られないomxplayer)<LF> EOF
  3. "q" EOF ... <LF> EOF

何が起こるかはomxplayer、これをどのように処理するかに完全に依存しており、オペレーティングシステムやシェルがそれを台無しにするという問題ではありません。

于 2013-11-12T21:30:27.710 に答える
1

omxplayer その(コマンド)入力には少しうるさいです。qコマンド ( など) が newline で終了するのは好きではありません'\n'改行をコマンド ( ) の一部にすることで誤って処理さ'q''\n'れ、未知のコマンドになります (一方'q'、有効なコマンドとしてのみ存在します)。したがって、コマンドを に -ingする場合は、この-nオプションが必要です。echoomxplayer

のこの「誤った処理」とは別に、代わりomxplayerに を使用すると同じ動作が見られます。2 番目cat pipe1 | catkill した後、最初の. catecho cat

于 2014-02-09T06:25:07.927 に答える