为什么IPC :: SharedMem忽略构造函数中的KEY参数?

时间:2011-08-10 09:12:39

标签: perl ipc sysv

我想使用共享内存段来发布Perl守护程序的状态,因此同一系统中的其他程序(Linux 2.6内核)可以读取状态并生成简单的报告。

其他程序需要知道共享内存ID或KEY才能从中读取数据,所以当我创建共享内存段时,我必须选择一个ID(不是随机的)。

所以我做了一个简单的程序来测试整个事情,这里发现了一些奇怪的东西:当我使用特定的KEY / ID作为共享内存段时,当我打印共享段ID时,它与我的不同选择。

#!/usr/bin/env perl

use 5.012;
use strict;
use IPC::SysV qw/IPC_CREAT/;
use IPC::SharedMem;

# 14614000 is beautifully ignored 
my $shm = IPC::SharedMem->new( 14614000, 8, 00400 | IPC_CREAT );

$shm->write( pack ( 'S', 2 ), 0, 1 );

# Shared memory ID is random
say $shm->id;

getc;

$shm->remove;

只有当我使用屏幕上打印的ID时,我才能从其他程序访问共享内存段,我也可以使用

ipcs -m

我确定我做错了什么,但IPC :: SharedMem文档没有帮助找出答案。 有什么建议吗?

编辑:我做了更多的RTFM并且理解KEY和ID不是一回事。

这是“服务器”程序......

#!/usr/bin/env perl

use 5.012;
use strict;
use IPC::SysV qw/ftok IPC_CREAT IPC_RMID/;

# Make a key: you have to use same parameters of ftok() o refer to this
# shared memory segment.
my $key = ftok( 'ipc_shmem_write.pl', 'A' );

# Create a 16 bytes shared memory segment setting IPC_CREAT
my $id = shmget ( $key, 16, 00644 | IPC_CREAT ) or die "shmget: $!\n";

# Write a 4 octet string to the memory segment starting at offset 0.
shmwrite( $id, 'test', 0, 4 ) or die "shmwrite: $!\n";

# Just wait a key press
getc;

# Destroy shared memory segment, with command IPC_RMID
shmctl( $id, IPC_RMID , 0 ) or die "shmctl: $!\n";

和“客户”程序

#!/usr/bin/env perl

use 5.012;
use strict;
use IPC::SysV qw/ftok/;

# Get the same key used by the 'server' program
my $key = ftok( 'ipc_shmem_write.pl', 'A' );

my $status;

# Open the shared memory segment corresponding to KEY $key
my $id = shmget( $key, 16, 0444 ) or die "shmget: $!\n";

# Read 4 octets from shared memory at pos 0 and put in $status
shmread( $id, $status, 0, 4 ) or die "shmread: $!\n";

say $status;

现在它可以工作:“客户端”程序打印字符串“test”。

0 个答案:

没有答案