scanadf 스크립트에서 호출하면 pnmtops 하위 프로세스가 중단됩니다.

scanadf 스크립트에서 호출하면 pnmtops 하위 프로세스가 중단됩니다.

나는 scanadf몇 년 동안 이 매개변수를 즐겁게 사용해 왔습니다.-S script --script-wait

scan_perpage내 스크립트는 Convert image data to pdf by call, piping 이라고 합니다.pnmtopsps2pdf

그러나 최근에는(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는 "읽기"를 기다리고 있음을 나타냅니다.

pnmtopsvia 를 호출할 때 왜 멈추는지 이해가 안 되지만 scanadf, 동일한 파일에서 직접 호출하면 잘 작동합니다.

또한 pnmtops하위 프로세스를 수동으로 종료하면 모든 것이 문제 없이 계속됩니다.

답변1

netpbm 관리자 Bryan Henderson의 글:

이 증상을 일으키는 버그를 찾아 수정했습니다. [...] Netpbm 10.64.02에서 수정되었습니다.

Pnmtops가 때로는 중단되고 때로는 중단되는 환경적 차이는 열린 파일 수입니다. 10개 이상의 파일이 열려 있는 상태에서 Pnmtops를 호출하면 정지가 발생합니다.

병리가 무엇인지 관심이 있는 경우: 아이에게 먹이를 주는 도관이 EOF 신호를 보낼 때 아이는 종료됩니다. 이는 파이프의 전송 측에 있는 파일 설명자의 모든 복사본이 닫힐 때 발생합니다. 존재해야 하는 유일한 복사본은 상위 프로세스가 데이터를 쓰는 복사본입니다. 그러나 하위 프로세스는 파이프 양쪽 끝에 있는 파일 설명자의 복사본을 상속해야 합니다. 아이가 복사본을 닫지 않으면 보내다파이프 끝에서 하위 프로세스는 수신 측에서 EOF를 볼 수 없으므로 영원히 기다립니다.

이는 하위 프로세스가 자신에게 전원을 공급하는 파이프의 송신 측 복사본을 닫아야 함을 의미합니다. 이를 수행하고 다른 유사한 문제를 해결하기 위해 하위 프로세스는 실제로 사용하는 두 가지를 제외하고 시작 시 모든 파일 설명자를 닫으려고 시도합니다. 그러나 POSIX는 열린 파일 설명자 목록을 알 수 있는 방법을 제공하지 않으므로 하위 프로세스는 Pnmtops가 그 이상을 사용하지 않는다는 것을 알고 맹목적으로 0-9(필요한 두 개 제외)를 닫습니다. 오류는 프로그램이 프로세스에 고유한 파일 설명자를 고려하지 않는다는 것입니다. 수정 사항은 Pnmtops가 시작 시 파일 설명자 0-9를 닫아 Pnmtops가 생성하는 모든 파이프가 0-9 범위의 파일 설명자 번호를 갖게 하여 블라인드 0-9 닫기를 통해 닫히도록 하는 것입니다.

관련 정보