加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么IPC :: SysV-> shmget用EINVAL响应?

发布时间:2020-12-16 06:25:01 所属栏目:大数据 来源:网络整理
导读:我目前在服务器上运行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/
我目前在服务器上运行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,"177ELF111331 v004"...,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.

现在,我的问题是,有没有一个很好的理由可以将其设置为零?

解决方法

问题解决了.

/etc/sysctl.conf文件包含以下内容:

kernel.shmmax = 137438953472

这是64位值,但系统是32位系统.

结果,SHMMAX值被设置为0,使得对shmget的所有调用都失败.

把它改成

kernel.shmmax = 4294967295

并使用

echo 4294967295 >/proc/sys/kernel/shmmax

我更改了SHMMAX的值,测试成功完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读