なぜ配管入力はzenityに適していますが、

なぜ配管入力はzenityに適していますが、

私の質問はzenity --text例のパラメータと同じくらい簡単です。しかし、リダイレクトによってCPU使用率が100%発生する原因は何ですか?
...(しかし、この特別な使い方は<実際に言われていますredirection。代わりに方向を作るようです。~について-監督)..

echo "Peacocks talking of the colour grey."> test
cat test | zenity --text='This does NOT hog the CPU'   --list --column='#' --width=450 
<test      zenity --text='This hogs 100% of CPU usage' --list --column='#' --width=450
 

使えて嬉しいですcat test |(この場合は役に立たないからです。効果があり、|ある意味では違いがありますが、再追跡することはできません...

明らかに、<test両方ともcat test |有効です。どちらの場合も、zenityダイアログが表示され、完全に機能しますが、そのバージョンのダイアログが<test開いている限り、単一の「コア」VM%で100%CPU(1コア)... 94を使用します。 。

答え1

これはzenityのバグのようです。このツールを使用して、何が起こっているのかを確認できます。strace(この記事で追跡ラインを読みやすくするためにラップしました。)

パイプバージョンの場合、straceのこの行は、catパイプが閉じられると(終了のために)何が起こるかを示しています。

poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}], \
     3, 0) = 1 ([{fd=0, revents=POLLIN|POLLHUP}])

最後の部分は -fd=0, revents=POLLIN|POLLHUP具体的にはPOLLHUP- zenityに標準入力が中断されたことを伝えます(パイプ作成者は消えました)。 Zenityはそれを正しく処理し、後でfd 0を閉じます。

ファイルはイベントを受け取りませんPOLLHUP。代わりにread(2)結果がゼロの場合、EOFを意味します。これはzenityの他のコードパスです。 fd 0 を再びポーリングし、次の結果を得る。

poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=0, events=POLLIN}],\
     3, 0) = 1 ([{fd=0, revents=POLLIN}])
read(0, "", 1024)       = 0

これが終わりです。ゼロ読み取りのため、zenityはfd 0を閉じる必要があります。しかしそれは真実ではない。 zenity は fd 0 をポーリングし続けるため、上記の strace 出力は繰り返し繰り返されます。 fd 0が閉じるまで常に読み取る準備ができています。これは、EOF結果を得るためにファイル記述子を読み取る必要があるため、EOFのファイル記述子が機能する方法であるためです。

zenityはstdinのEOFにpoll(2)正しく応答しないので。何度も何度も…read(2)pollread

答え2

この試み:

zenity --text='This does NOT hog the CPU' --list --column='#' --width=450 <(cat test)

関連情報