2017-11-21 8 views
0

私は、スレッドとフォークモジュールをそれぞれ使って、WindowsとLinux用のPerlマルチスレッドソフトウェアを開発しています。 標準出力をシェルに向けるとすべてうまく動作しますが、スクリプトにTkモジュールを組み込んでGUIを作成すると、Windows版のアプリケーションだけがうまく動作します(実際はうまくいきませんが、出力は受け入れられます)。私がLinux上でForksモジュールとスクリプトを起動する簡単なボタンと一緒に実行しようとすると、何かが間違っていました。以下はPERL Tkとフォークのミスマッチモジュール

、あなたはそれに関連付けられたエラーメッセージを見つけることができます:

プロトタイプの不一致は、両方の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'モジュールをロードする方法と、プロセスをforkする方法を示す(最小限の)コードを提供してください。 –

+1

Perl/TKはスレッドセーフではありません。同じ糸の中から常に物事を行う必要があります。しかし、Windowsのforkはスレッドを使ってエミュレートされます。 –

+0

また、 "forkされたプロセスからexitを使うと、子プロセスと親プロセスの両方が終了します。デフォルトでTk :: exitがインポートされるので、代わりにforkしたプロセスでCORE :: exitを使うべきです。 – charlesbridge

答えて

1

forksモジュールのバグです。ひどく深刻な問題ではありませんが、問題はforksモジュールにあります。

perlの組み込み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モジュール1と同じように見えます。何か案が? – technoleap84

関連する問題