我目前在服务器上运行perl 5.8.8,我正在尝试安装5.14.
我将其配置为usethreads和use64bitint,否则为其建议的默认值.
make run没有问题,但是让测试失败了
../cpan/IPC-SysV/t/ipcsysv.t ../cpan/IPC-SysV/t/shm.t
从而:
# ./perl harness ../cpan/IPC-SysV/t/shm.t ../cpan/IPC-SysV/t/ipcsysv.t ../cpan/IPC-SysV/t/shm.t ...... IPC::SharedMem->new Failed: Invalid argument at t/shm.t line 54. ../cpan/IPC-SysV/t/shm.t ...... DubIoUs,test returned 22 (wstat 5632,0x1600) No subtests run ../cpan/IPC-SysV/t/ipcsysv.t .. 1/38 shmget Failed: Invalid argument at t/ipcsysv.t line 100. # Looks like you planned 38 tests but ran 17. # Looks like your test exited with 22 just after 17. ../cpan/IPC-SysV/t/ipcsysv.t .. DubIoUs,0x1600) Failed 21/38 subtests Test Summary Report ------------------- ../cpan/IPC-SysV/t/shm.t (Wstat: 5632 Tests: 0 Failed: 0) Non-zero exit status: 22 Parse errors: No plan found in TAP output ../cpan/IPC-SysV/t/ipcsysv.t (Wstat: 5632 Tests: 17 Failed: 0) Non-zero exit status: 22 Parse errors: Bad plan. You planned 38 tests but ran 17. Files=2,Tests=17,0 wallclock secs ( 0.01 usr 0.00 sys + 0.13 cusr 0.00 csys = 0.14 cpu) Result: FAIL
这两个测试都报告了“无效参数”,但是当我查看源代码时,我看不到任何看起来无效的内容.我不确定如何继续…任何指针?
UPDATE
我跑了
strace perl -MIPC::SysV=IPC_PRIVATE,S_IRWXU -e 'shmget(IPC_PRIVATE,8,S_IRWXU) or die $!'
在两台服务器上:一台有这些问题,一台没有.
有很多输出,但看起来很有趣的是:
好:
. . . stat64("/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/site_perl/5.8.8/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/site_perl/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/5.8.8/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/auto/IPC/SysV",0x9d7f0c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",{st_mode=S_IFDIR|0755,st_size=4096,...}) = 0 stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so",{st_mode=S_IFREG|0755,st_size=15072,...}) = 0 stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.bs",0x9d7f0c8) = -1 ENOENT (No such file or directory) futex(0x4d106c,FUTEX_WAKE_PRIVATE,2147483647) = 0 open("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so",O_RDONLY) = 4 read(4,"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \v\0\0004\0\0\0"...,512) = 512 fstat64(4,...}) = 0 mmap2(NULL,17948,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_DENYWRITE,4,0) = 0x588000 mmap2(0x58c000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,0x3) = 0x58c000 close(4) = 0 close(3) = 0 shmget(IPC_PRIVATE,0700) = 7438344 exit_group(0)
坏:
. . . stat64("/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/site_perl/5.8.8/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/site_perl/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/5.8.8/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/vendor_perl/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV",0x8d290c8) = -1 ENOENT (No such file or directory) futex(0x94306c,0) = 0x6a4000 mmap2(0x6a8000,0x3) = 0x6a8000 close(4) = 0 close(3) = 0 shmget(IPC_PRIVATE,0700) = -1 EINVAL (Invalid argument) open("/usr/share/locale/locale.alias",O_RDONLY) = 3 fstat64(3,{st_mode=S_IFREG|0644,st_size=2528,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0xb7dbe000 read(3,"# Locale name alias data base.\n#"...,4096) = 2528 read(3,"",4096) = 0 close(3) = 0 munmap(0xb7dbe000,4096) = 0 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/libc.mo",O_RDONLY) = -1 ENOENT (No such file or directory) write(2,"Invalid argument at -e line 1.\n",31Invalid argument at -e line 1. ) = 31 exit_group(22) = ?
所以,看来在两台服务器上都发生了同样的事情,我只看到它就在一台服务器上
shmget(IPC_PRIVATE,0700)= 7438344
另一方面,我明白了
shmget(IPC_PRIVATE,0700) = -1 EINVAL (Invalid argument)
IPC :: SysV的版本在两台服务器上都是相同的…但它在我看来这是不相关的,问题是系统调用的代码……对吗?
接下来是什么?
**更新2 **
好:
# cat /proc/sys/kernel/shmmax 4294967295
坏:
# cat /proc/sys/kernel/shmmax 0
所以,这解释了EINVAL,因为(从the man pages开始)
EINVAL
A new segment was to be created and size < SHMMIN or size > SHMMAX,or no new segment
was to be created,a segment with given key existed,but size is greater than the size
of that segment.
现在,我的问题是,有没有一个很好的理由可以将其设置为零?