2011-06-22 14 views
5

私は現在、サーバ上でperl 5.8.8を実行しています。私は5.14をインストールしようとしています。なぜIPC :: SysV-> shmgetはEINVALで応答しますか?

私はusethreadsと64bitintを使用するように設定しました。

メイクは問題なく走ったが、テストが失敗されていることを確認し、これ

../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, test returned 22 (wstat 5632, 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は、私は2台のサーバー上で

strace perl -MIPC::SysV=IPC_PRIVATE,S_IRWXU -e 'shmget(IPC_PRIVATE, 8, S_IRWXU) or die $!' 

を走りました。

あり、出力の多くはでしたが、どのような興味深い現れることはこれです:

GOOD:

. 
. 
. 
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, {st_mode=S_IFREG|0755, st_size=15072, ...}) = 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, 4, 0x3) = 0x58c000 
close(4)        = 0 
close(3)        = 0 
shmget(IPC_PRIVATE, 8, 0700)   = 7438344 
exit_group(0)      

BADは:

. 
. 
. 
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", {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", 0x8d290c8) = -1 ENOENT (No such file or directory) 
futex(0x94306c, 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, {st_mode=S_IFREG|0755, st_size=15072, ...}) = 0 
mmap2(NULL, 17948, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x6a4000 
mmap2(0x6a8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x3) = 0x6a8000 
close(4)        = 0 
close(3)        = 0 
shmget(IPC_PRIVATE, 8, 0700)   = -1 EINVAL (Invalid argument) 
open("/usr/share/locale/locale.alias", O_RDONLY) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=2528, ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, 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)       = ? 

だから、それは同じことが起こっていることが表示されます両方のサーバーで、それはちょうど1つで、私は参照してください shmget(IPC_PRIVATE、8、0700)= 7438344

およびその他の、私は

shmget(IPC_PRIVATE, 8, 0700)   = -1 EINVAL (Invalid argument) 

IPC :: SysVののバージョンは、両方のサーバーで同じである参照...しかし、これは関係ありませんように私には見えますし、問題があることをシステムコールをするコード...右?

次は何ですか?

** UPDATE 2 **

いくつかのグーグルの後は、私は次のことを実行しました:

GOOD:

# cat /proc/sys/kernel/shmmax 
4294967295 

BAD:

だから、
# cat /proc/sys/kernel/shmmax 
0 

、説明しますEINVAL、以来(the man pagesから)

EINVAL

新しいセグメントが作成されることになったとサイズ< SHMMINまたはサイズ> SHMMAX、または全く新しいセグメント を作成するなかった、指定されたキーを持つセグメントが存在するが、サイズがより大きいそのセグメントのサイズ 。

ここで、私の質問は、これがゼロに設定される理由はありますか?

+1

テストに挑戦してみませんか? – bdonlan

+0

また、IPC :: SysVのメンテナに – bdonlan

+0

と報告しているはずです。shmget()が失敗したため、IPC :: SharedMem-> new()が無効な引数で失敗したようです。 shmgetの定義は、new()コンストラクタと同様に 'int shmget(key_t key、size_t size、int shmflg);'です。 何かがうまくいかず、おそらくshmflgパラメータで... カーネルは何歳ですか?最近のカーネルをビルドしようとしましたか? –

答えて

5

問題を解決しました。

/etc/sysctl.confファイルは、以下を含んだ:

kernel.shmmax = 137438953472 

これは64ビット値であるが、システムは、32ビットシステムです。

この結果、SHMMAXの値は0に設定され、shmgetへのすべての呼び出しが失敗しました。

kernel.shmmax = 4294967295 

にそれを変更し、

echo 4294967295 >/proc/sys/kernel/shmmax 

を使用して、私はSHMMAXの値と正常に完了し、テストを変更しました。

関連する問題