私は2、3年の間パラメータを使って楽しく使っscanadf
てい-S script --script-wait
ます。
と呼ばれる私のスクリプトはscan_perpage
、への呼び出しを介して画像データをpdfに変換しpnmtops
、パイプを介してps2pdf
。
ただし、最近(Fedora 17から19に更新してからだと思います)、呼び出されたスクリプトがハングするため、scanadf
ハングします。スクリプトはpnmtops
コマンドでハングします。pnmtops
コマンド自体は、そのフォーク「子」を待っているpnmtops
、完全に出力フィルタ、およびそれはありませんことはありません。
scan_perpage
生のスキャナーページ出力でスクリプトを直接実行すると、正常に機能します。pnmtops
コマンドを直接実行することも問題なく機能します。スクリプトがでハングするのは、scanadf
viaから実行した場合のみです。-S
pnmtops
バージョン:
# rpm -q --info sane-backends
Name : sane-backends
Version : 1.0.23
Release : 13.fc19
# rpm -q --info sane-frontends
Name : sane-frontends
Version : 1.0.14
Release : 16.fc19
# rpm -q --info netpbm
Name : netpbm
Version : 10.61.02
Release : 5.fc19
scan
これが私のスクリプトの出力ですscanadf -vv
。
$ scan -o output.pdf
Scanning...
scanadf: value for --resolution is: 300
scanadf: scanning image of size 2544x3300 pixels at 1 bits/pixel
scanadf: acquiring gray frame
Started script `/usr/local/bin/scan_perpage' as pid=10902
Scanned document scan-0001
pnmtops: Input maxval is 1. Postscript raster will have 1 bits per
sample, so maxval = 1
pnmtops: Image will be 610.56 points wide by 792.00 points high, left
edge 0.72 points from left edge of page, bottom edge 0.00 points from
bottom of page; NOT turned to landscape orientation
pnmtops: output filter spawned: pid 10904
pnmtops: Waiting for PID 10904 to exit
Scanned 1 pages
<the script hangs here>
ハングした時点のプロセスツリーは次のとおりです。
10897 32072 /bin/sh /usr/local/bin/scan -o output.pdf
10898 10897 scanadf -vvv -d fujitsu -S /usr/local/bin/scan_perpage
--script-wait --resolution 300 --mode Lineart -o scan-%04d
10902 10898 /bin/bash /usr/local/bin/scan_perpage scan-0001
10903 10902 pnmtops -verbose -imagewidth 8.5 -imageheight 11 scan-0001
10904 10903 pnmtops -verbose -imagewidth 8.5 -imageheight 11 scan-0001
プロセス10904(分岐したpnmtops
「出力フィルター」)が終了することはありません。straceは、「読み取り」を待機していることを示します。
をpnmtops
介して呼び出されたときにハングする理由はわかりませんscanadf
が、同じファイルで直接呼び出された場合は完全に正常に機能します。
さらに、pnmtops
サブプロセスが手動で強制終了された場合、すべてが問題なく続行されます。
netpbmのメンテナーであるBryanHendersonから:
この症状の原因となるバグを見つけて修正しました。[...]修正はNetpbm10.64.02にあります。
Pnmtopがハングする場合とハングしない場合がある環境の違いは、開いているファイルの数です。Pnmtopsが呼び出されたときに開いているファイルが10を超えると、ハングが発生します。
あなたが病状が何であるかを気にする場合:それを供給するパイプがEOFを合図するとき、子供は出ます。これは、パイプの送信側のファイル記述子のすべてのコピーが閉じるときに発生します。存在するはずの唯一のコピーは、親プロセスがデータを書き込んでいるコピーです。ただし、子は必然的にパイプの両端のファイル記述子のコピーを継承します。子がパイプの送信側のコピーを閉じない場合、子は受信側でEOFを確認できないため、永久に待機します。
つまり、子供は、それを供給しているパイプの送信端のコピーを閉じる必要があります。これを行い、他のいくつかの同様の問題を修正するために、子は起動時に、実際に使用する2つ以外のすべてのファイル記述子を閉じようとします。ただし、POSIXは開いているファイル記述子のリストを知る方法を提供しないため、Pnmtopsがそれ以上のファイルを使用しないことを知って、子は0〜9(必要な2つを除く)を盲目的に閉じます。間違いは、プログラムがプロセスが生まれたファイル記述子を考慮していなかったことでした。修正は、Pnmtopsが起動時にファイル記述子0〜9を閉じるようにすることです。これにより、Pnmtopsが作成するパイプは、ファイル記述子番号が0〜9の範囲になり、ブラインド0〜9のクローズによって閉じられます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加