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

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

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

이라는 내 스크립트는 에 대한 호출 을 scan_perpage통해 이미지 데이터를 pdf로 변환합니다 .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가 때로는 중단되고 때로는 중단되지 않는 환경의 차이는 열린 파일 수입니다. Pnmtops가 호출될 때 열려 있는 파일이 10개보다 많으면 중단이 발생합니다.

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

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

관련 정보