2010-06-01 2 views
2

분기 된 하위 프로세스에서 croak을 통해 예외를 throw하면 백그라운드 프로세스로 오류가 인쇄됩니다. 즉, 쉘 프롬프트를 깬다.fork 된 자식에서 croak에 의해 throw 된 예외를 부모/foreground 프로세스에 전파하려면 어떻게해야합니까?

croak 대신 die 인 경우 오류 메시지가 포 그라운드 프로세스로 나타납니다. 나는 이것이 운이없는 Carp 문서에 왜 있는지 알아 내려고 노력했습니다.

내 뜻은 이렇습니다. croak 버전 :

$ perl Wrapper.pm 
$ error: ... does not exist at Wrapper.pm line 624 

die 버전 :

$ perl Wrapper.pm 
error: ... does not exist at Wrapper.pm line 515. 

은 내가 fork 트래핑 및 STDERR에 [email protected]를 인쇄하고 종료했지만, 그 영향을주지 않았다. 어떤 아이디어? 이 특별한 경우에 croak을 사용할 수 있기를 바랍니다. 해결

$ perl -MCarp -e 'unless (fork) {croak "child"}' 
$ child at -e line 1 
    <- cursor blinking here. Pressing enter gives me a new prompt: 
$ 

$ perl -e 'unless (fork) {die "child"}' 
child at -e line 1. 
$ 

: CJM got it : 도움을

$ perl -e '$SIG{__DIE__} = sub {sleep 1}; unless (fork) {die "child"}' 
$ child at -e line 1. 

덕분에 내 코드는 아주 조금 더 복잡하지만

, 여기 당신이이 문제를 재현 할 수있는 방법입니다!

+2

자식 프로세스의'die' 호출은 부모에게 에러 메시지를 띄우거나'die' 나'croak' 메시지가 쉘 프롬프트와 관련이 있다는 것을 회의적입니다. 이 동작을 나타내는 작은 코드 스 니펫을 게시 할 수 있습니까? – mob

+0

예, 소식이 업데이트되었습니다. –

답변

3

저는 타이밍 문제 일뿐입니다. die 버전은 약간 빠르기 때문에 쉘이 다음 프롬프트를 인쇄하기 전에 오류 메시지를 출력 할 가능성이 더 큽니다. 예제를 실행하려고하면 보통 croak 버전이 프롬프트 후에 인쇄되지만 때로는 프롬프트 앞에 표시됩니다. die 버전은 매우 일관되게 프롬프트 앞에옵니다.

관련 문제