私の質問は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)
poll
read
答え2
この試み:
zenity --text='This does NOT hog the CPU' --list --column='#' --width=450 <(cat test)