2017-11-21 1 views
0

Windows 및 Linux 용 Perl 다중 스레딩 소프트웨어를 각각 스레드 및 포크 모듈을 사용하여 개발하고 있습니다. 모든 것이 쉘로 보내지는 표준 출력으로 잘 작동하지만 일단 스크립트에 Tk 모듈을 포함시켜 GUI를 생성하기로 결정하면 응용 프로그램의 Windows 버전 만 제대로 작동하지만 실제로는 좋지 않지만 출력은 사용할 수 있습니다. 내가 리눅스에서 Forks 모듈과 스크립트를 시작하는 간단한 버튼과 함께 실행하려고하면 뭔가 잘못되었다. 다음은PERL Tk 및 Forks 불일치 모듈

, 당신은 그와 관련된 오류 메시지를 찾을 수 있습니다

프로토 타입 불일치 모두의 Tk와 포크 모듈에 포함 된 공통 기능과 연계 될 수 있지만, 솔직히 나는 방법을 모른다
***.button (1): 
0 0x32bef88 IV f=00000001 undef(1) 
SV = IV(0x32bef78) at 0x32bef88 
    REFCNT = 1 
    FLAGS =() 
    IV = 0 
Prototype mismatch: sub CORE::GLOBAL::exit (;$) vs none at /usr/local/lib/perl5/site_perl/5.26.0/x86_64-linux/forks.pm line 1509.*** 

그것을 해결하십시오. 'Tk'함수의 특정 '포크'를 포함 시키려고했지만이를 수정할 방법이 없습니다.

이 주제에 대한 도움을 미리 감사드립니다.

+0

'Tk' 모듈과'forks' 모듈을 어떻게로드하는지 보여주는 최소한의 예제 코드를 제공하십시오. 그리고 프로세스를 포크하는 방법을 알려주세요. –

+1

Perl/TK는 제가 아는 바에 따르면 스레드 안전하지 않습니다. 항상 동일한 스레드 내부에서 작업을 수행해야합니다. 그러나 Windows의 포크는 스레드를 사용하여 에뮬레이트됩니다. –

+0

또한 "fork 된 프로세스의 exit를 사용하면 자식 프로세스와 부모 프로세스가 모두 종료됩니다. 기본적으로 Tk :: exit를 가져 오므로 분기 된 프로세스에서 CORE :: exit를 사용해야합니다." – charlesbridge

답변

1

이것은 forks 모듈의 버그입니다. 대단히 심각하지는 않지만 문제는 forks 모듈에 있습니다.

펄 내장 exit 함수는 프로토 타입

$ perl -E 'say prototype "CORE::exit"' 
;$ 

forks 모듈 sometimes tries to redefine the exit function

{ 
    no warnings 'redefine'; 
    *CORE::GLOBAL::exit = $old_core_global_exit; 
} 

를해야하지만 다시 a subroutine that was not defined with a prototype

# Keep reference to pre-existing exit function 
my $old_core_global_exit; 
BEGIN { 
    $old_core_global_exit = sub { CORE::exit(@_) }; 
} 

로 그렇게, 이것은이 아니다 심각한 버그,하지만 당신이 그것을 해결하려는 경우, 하위 정의

$old_core_global_exit = sub (;$) { CORE::exit(@_) }; 

의 프로토 타입을 포함 forks.pm의 사본을 편집하고 영구 수정, contact the author을 원하는 버그 보고서를 작성합니다.

+0

감사합니다. 나는 단지 * CORE :: GLOBAL :: exit = $ old_core_global_exit;을 대체했다. 새로운 것과 라인 : $ old_core_global_exit = sub (; $) {CORE :: exit (@_)}; BEGIN 하위 내에서. 불행히도 그것은 작동하지 않습니다 ... 출력은 여전히 ​​동일합니다. 보고 된 버그는 스크립트에 포함 된 Tk 모듈과 동일하게 보입니다. 어떤 생각? – technoleap84

관련 문제