PERL-Tk和Forks模块不匹配

PERL-Tk和Forks模块不匹配,perl,Perl,我正在为Windows和Linux开发一个Perl多线程软件,分别使用threads和forks模块。 通过将标准输出定向到shell,一切都可以正常工作,但是一旦我决定通过在脚本中包含Tk模块来生成GUI,就只有Windows版本的应用程序可以正常工作(实际上不是很好,但输出是可以接受的),就像我尝试在Linux上与Forks模块和启动脚本的简单按钮一起运行时一样,出了点问题 在下面,您可以找到与其关联的错误消息: ***.button (1): 0 0x32bef88 IV f=000

我正在为Windows和Linux开发一个Perl多线程软件,分别使用threads和forks模块。 通过将标准输出定向到shell,一切都可以正常工作,但是一旦我决定通过在脚本中包含Tk模块来生成GUI,就只有Windows版本的应用程序可以正常工作(实际上不是很好,但输出是可以接受的),就像我尝试在Linux上与Forks模块和启动脚本的简单按钮一起运行时一样,出了点问题

在下面,您可以找到与其关联的错误消息:

***.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和Forks模块中嵌入的一个公共函数有关,但老实说,我不知道如何解决它。 我一直在尝试包含“Tk”函数的特定“分叉”,但没有办法修复它


提前感谢您对本主题的帮助。

这是
forks
模块中的一个bug。这不是一个非常严重的问题,但问题在于
forks
模块

perl内置的退出函数应该有一个原型

$ perl -E 'say prototype "CORE::exit"'
;$
分叉
模块

但它是用

同样,这不是一个严重的bug,但是如果您想修复它,请编辑您的
forks.pm
副本,在子定义中包含一个原型

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

如果你想要一个永久性的修复,并做一个bug报告。

请提供一个(最少的)示例代码,说明如何加载
Tk
forks
模块,以及如何派生一个进程据我所知perl/Tk不是线程安全的,即所有与Tk相关的事情都必须始终在同一个线程内完成。但是Windows中的fork是使用线程模拟的。另外,“使用fork进程的exit将终止子进程和父进程。由于默认情况下导入了Tk::exit,因此应该在fork进程中使用CORE::exit。”谢谢。我似乎理解在上述两个模块中定义的相同功能之间存在冲突。在脚本开头声明CORE::exit函数时,有没有一种方法可以从Tk甚至fork中删除(而不是导入)CORE::exit函数?谢谢mob。我刚刚替换了*CORE::GLOBAL::exit=$old\u CORE\u GLOBAL\u exit;与新的一行:$old_core_global_exit=sub(;$){core::exit(@));在子系统内开始。不幸的是,它不工作…输出仍然是一样的。报告的bug似乎与脚本中包含的Tk模块1相同。有什么想法吗?
# 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(@_) };