scanadfスクリプトから呼び出されると、pnmtopsサブプロセスがハングする

ラマン

私は2、3年の間パラメータを使って楽しく使っscanadfてい-S script --script-waitます。

と呼ばれる私のスクリプトはscan_perpage、への呼び出しを介して画像データをpdfに変換しpnmtops、パイプを介してps2pdf

ただし、最近(Fedora 17から19に更新してからだと思います)、呼び出されたスクリプトがハングするため、scanadfハングします。スクリプトはpnmtopsコマンドでハングします。pnmtopsコマンド自体は、そのフォーク「子」を待っているpnmtops、完全に出力フィルタ、およびそれはありませんことはありません。

scan_perpage生のスキャナーページ出力でスクリプトを直接実行すると、正常に機能します。pnmtopsコマンドを直接実行することも問題なく機能します。スクリプトがでハングするのは、scanadfviaから実行した場合のみです。-Spnmtops

バージョン:

# 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]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonプログラムはサブプロセスから呼び出されると永久にハングします

分類Dev

Javaアプリケーションから呼び出されたときにPowershellプロセスがハングする

分類Dev

OpenMPを使用する共有ライブラリの関数が、swigを介してサブプロセスから呼び出されたときにハングするのはなぜですか?

分類Dev

Bashプログラミング-スクリプトが別のスクリプトから呼び出されたときにのみ返される変数

分類Dev

PHP shell_exec()を介して呼び出されるとPythonスクリプトがハングする

分類Dev

サブプロセスでbashスクリプトを呼び出そうとすると、許可が拒否されます

分類Dev

マルチスレッドのPerlスクリプトは、Pythonサブプロセスとして呼び出されるとパイプが壊れる

分類Dev

Pythonサブプロセス呼び出しがハングしますか?

分類Dev

corbaサーバープロセスが停止すると、クライアントの呼び出しがブロックされます

分類Dev

スクリプトを介して呼び出されると、DynamicsCRMダイアログがハング/フリーズします

分類Dev

ユーザーから入力を取得し、Pythonのサブプロセス呼び出しによってトリガーされるインタラクティブなコマンドラインプログラムに渡す方法は?

分類Dev

Pythonスクリプトがサブプロセスとして呼び出され、引数を渡すかどうかを決定します

分類Dev

サブプロセスを使用してシェルスクリプトを呼び出すと、シェルスクリプトのすべてのコマンドが実行されるわけではありません

分類Dev

サービスの子プロセスから呼び出されたときにCreateProcessAsUserが「アクセス拒否」で失敗する理由

分類Dev

ホストプロセスがWaitForでブロックされた場合、親プロセスが再設定されたウィンドウを持つゲストプロセスがダイアログの呼び出しでハングします<...>

分類Dev

Celluloid :: IOでスリープを呼び出すと、プロセスが永久にブロックされるのはなぜですか

分類Dev

Celluloid :: IOでスリープを呼び出すと、プロセスが永久にブロックされるのはなぜですか

分類Dev

CTRL + CがBashスクリプトから呼び出されたプロセスに送信されないようにする

分類Dev

phpスクリプトから呼び出されたINSERTINTOが失敗する

分類Dev

phpスクリプトから呼び出されたINSERTINTOが失敗する

分類Dev

ラムダハンドラーでリクエストプロミスを使用すると、呼び出しが放棄されます

分類Dev

シェルスクリプトでexecを呼び出すと、無効なプロセスが生成されるのはなぜですか?

分類Dev

スクリプトがdivタグのすぐ下で呼び出されるとどうなりますか?

分類Dev

サブプロセスpythonマルチスレッド呼び出しから昇格された特権でbashスクリプトを実行します

分類Dev

std :: coutを複数回呼び出すと、サブプロセスがハングします

分類Dev

Applescript:スクリプトが呼び出されたウィンドウからペインを分割するiTerm

分類Dev

別のスクリプトから呼び出されるように、パブリック関数をjqueryプラグインに追加します

分類Dev

サブプロセスを呼び出した後、Pythonスクリプトが続行されない

分類Dev

document.write()で呼び出されるChromeブロッキングスクリプト-テスト方法

Related 関連記事

  1. 1

    Pythonプログラムはサブプロセスから呼び出されると永久にハングします

  2. 2

    Javaアプリケーションから呼び出されたときにPowershellプロセスがハングする

  3. 3

    OpenMPを使用する共有ライブラリの関数が、swigを介してサブプロセスから呼び出されたときにハングするのはなぜですか?

  4. 4

    Bashプログラミング-スクリプトが別のスクリプトから呼び出されたときにのみ返される変数

  5. 5

    PHP shell_exec()を介して呼び出されるとPythonスクリプトがハングする

  6. 6

    サブプロセスでbashスクリプトを呼び出そうとすると、許可が拒否されます

  7. 7

    マルチスレッドのPerlスクリプトは、Pythonサブプロセスとして呼び出されるとパイプが壊れる

  8. 8

    Pythonサブプロセス呼び出しがハングしますか?

  9. 9

    corbaサーバープロセスが停止すると、クライアントの呼び出しがブロックされます

  10. 10

    スクリプトを介して呼び出されると、DynamicsCRMダイアログがハング/フリーズします

  11. 11

    ユーザーから入力を取得し、Pythonのサブプロセス呼び出しによってトリガーされるインタラクティブなコマンドラインプログラムに渡す方法は?

  12. 12

    Pythonスクリプトがサブプロセスとして呼び出され、引数を渡すかどうかを決定します

  13. 13

    サブプロセスを使用してシェルスクリプトを呼び出すと、シェルスクリプトのすべてのコマンドが実行されるわけではありません

  14. 14

    サービスの子プロセスから呼び出されたときにCreateProcessAsUserが「アクセス拒否」で失敗する理由

  15. 15

    ホストプロセスがWaitForでブロックされた場合、親プロセスが再設定されたウィンドウを持つゲストプロセスがダイアログの呼び出しでハングします<...>

  16. 16

    Celluloid :: IOでスリープを呼び出すと、プロセスが永久にブロックされるのはなぜですか

  17. 17

    Celluloid :: IOでスリープを呼び出すと、プロセスが永久にブロックされるのはなぜですか

  18. 18

    CTRL + CがBashスクリプトから呼び出されたプロセスに送信されないようにする

  19. 19

    phpスクリプトから呼び出されたINSERTINTOが失敗する

  20. 20

    phpスクリプトから呼び出されたINSERTINTOが失敗する

  21. 21

    ラムダハンドラーでリクエストプロミスを使用すると、呼び出しが放棄されます

  22. 22

    シェルスクリプトでexecを呼び出すと、無効なプロセスが生成されるのはなぜですか?

  23. 23

    スクリプトがdivタグのすぐ下で呼び出されるとどうなりますか?

  24. 24

    サブプロセスpythonマルチスレッド呼び出しから昇格された特権でbashスクリプトを実行します

  25. 25

    std :: coutを複数回呼び出すと、サブプロセスがハングします

  26. 26

    Applescript:スクリプトが呼び出されたウィンドウからペインを分割するiTerm

  27. 27

    別のスクリプトから呼び出されるように、パブリック関数をjqueryプラグインに追加します

  28. 28

    サブプロセスを呼び出した後、Pythonスクリプトが続行されない

  29. 29

    document.write()で呼び出されるChromeブロッキングスクリプト-テスト方法

ホットタグ

アーカイブ