我正在做一些与mod_perl-Apache-Perl兼容性相关的研究.最近我尝试使用Perl 5.14.2构建mod_perl 2.0.4.编译阶段提前终止并出现错误:
modperl_perl.c: In function ‘modperl_perl_core_global_init’:
modperl_perl.c:58:9: error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
在这个地方写下面的代码:
GvCV(gv) = get_cv(cglobals->sub_name, TRUE);
Run Code Online (Sandbox Code Playgroud)
搜索可能产生此错误的内容,我发现以前版本的Perl和Perl 5.14(CORE/gv.h)之间存在差异:
#define GvCV(gv) (GvGP(gv)->gp_cv) /* previous versions */
Run Code Online (Sandbox Code Playgroud)
VS
#define GvCV(gv) (0+GvGP(gv)->gp_cv) /* in Perl 5.14 */
Run Code Online (Sandbox Code Playgroud)
0+
从定义中删除它允许mod_perl 2.0.4成功编译,这很好,因为与以前的版本相比,0+...
它不被识别为左值.
为什么0+
在GvCV的定义中使用并且是否有必要?或者删除它是否安全,并且GvCV(gv)
在以前的Perl版本中有类似的定义?
分析CPAN模块的来源我可以看到这样的事情:
...
package # hide from PAUSE
Try::Tiny::ScopeGuard;
...
Run Code Online (Sandbox Code Playgroud)
显然,它取自Try::Tiny
,但我也看到了其他模块中关键字和包标识符之间的这种评论package
.
为什么使用此程序?它的目标是什么,它有什么好处?
我有一个简单的脚本,定期验证(每隔几秒一次)是否有来自该服务器的互联网连接.要明确的是,它不是要检查外部站点/服务/服务器是否还活着.作为可靠的互联网目的地,我使用谷歌,雅虎等网站的IP.通常我使用3个目的地(局域网,ISP网络,外部ISP)
我目前负责的代码只是一个简单而肮脏的调用ping
:
my $pingResponse = `ping -c 1 -w 1 123.123.123.123`;
my $isConnected = parsePingResponse($pingResponse);
Run Code Online (Sandbox Code Playgroud)
它似乎有效,但我确信它不是完成此任务的正确/最佳方式.至少有3个缺点:外部系统调用,它很慢,它有一个相对较长的最后期限为1秒.
所以,我的问题是:如何简单有效地实现ping功能的perlish方式,以验证互联网连接是否还活着?
(我认为LWP是一种矫枉过正.如果一个站点或一个页面可用,这是不重要的,只要一些外部IP可以访问.可能它应该是一个简单的涉及低级网络)
我的初始任务是安装mod_perl 2.0.6 + Apache 2.2.22.
该过程因off64_t
编译mod_perl时出现许多错误而停止.所以,我开始深入挖掘.首先,我安装了两个新的Perl 5.8.9实例(因为我必须使用这个版本):一个线程版本和一个非线程版本(它们是相同的,只是usethreads
不同).尝试使用线程Perl重现相同,但成功完成并且没有任何off64_t
错误.
结论很明显:线程Perl提供必要的off64_t
,非线程的不提供.
进一步搜索,我比较config.h
(从core/<arch>/CORE
两个Perl'es的),和在该行3671我可以看到这个(在非螺纹的Perl):
/* HAS_OFF64_T:
* This symbol will be defined if the C compiler supports off64_t.
*/
/*#define HAS_OFF64_T / **/
Run Code Online (Sandbox Code Playgroud)
并在启用线程的Perl中:
#define HAS_OFF64_T /**/
Run Code Online (Sandbox Code Playgroud)
perl -V
两个Perl实例报告ccflags ='... -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ...'
都是使用的编译器标志.
据我所知,off64_t
用于大文件,与线程无关.我找到了关于off_t
和的信息off64_t
:
如果使用
_FILE_OFFSET_BITS = 64
此类型编译源(即off_t
)透明地替换为off64_t
.
简而言之:有两个相同的Perl版本,只有一个区别:usethreads
configure参数.Threaded Perl启用off64_t
,非线程Perl启用.
我的问题是:为什么会发生这种情况以及线程如何连接到 …
我并没有参与接近操作系统的编程技术,但据我所知,当在Perl中并行执行某些操作时,选择的武器fork
可能是一些基于它的有用模块.文档页面fork
说:
Does a fork(2) system call to create a new process running the same program at the same point.
Run Code Online (Sandbox Code Playgroud)
因此,拥有一个耗费大量内存并且需要fork
执行小任务的大型应用程序意味着将有2个大型perl进程,而第二个将浪费资源只是为了做一些简单的工作.
因此,问题是:如何使fork
代码的独立部分独立运行并消耗它所需的资源,该怎么做(或如何使用,如果它是唯一的方法)?
只是一个非常简单的例子:
use strict;
use warnings;
my @big_array = ( 1 .. 2000000 ); # at least 80 MB memory
sleep 10; # to have time to inspect easely the memory usage
fork();
sleep 10; # to have time to inspect easely the memory usage
Run Code Online (Sandbox Code Playgroud)
并且子进程也消耗80+ MB.
要明确:与这个分离的代码进行交流或以某种方式使用其结果并不重要,只是为了可以说" …
perl ×5
c ×1
compilation ×1
connection ×1
fork ×1
large-files ×1
mod-perl ×1
networking ×1
process ×1