为了多进程的程序能生成 UUID 在程序中使用共享内存来存放信号量, 以 P V 操作来控制不让生成 UUID 的程序会生成重复的 ID . 自己测试着后来发现出了一个奇怪的错误, 刚开始很正常,后来信号量的对象怎么样也 new 不起来.一直是没有定义.
#!/usr/bin/perl
usestrict;
useIPC::Semaphore;
useSmart::Comments;
useIPC::SysV qw(S_IRWXU S_IRUSR S_IWUSR IPC_CREAT IPC_NOWAIT SEM_UNDO);
my$mutex = IPC::Semaphore->new( 123, 1, S_IRUSR | S_IWUSR | IPC_CREAT );
$mutex->setall(1);
### $mutex 使用的时候, 每次 setall 都提示 Can't call method "setall" on an undefined value . 很是奇怪.上面这个程序实在简单.后来使用 strace 跟了一下程序. 发现最后报的错是
No space left on device. 也就是讲,其实有些东西达到了操作系统的限制.
所以查了查相关的东西.使用 ipcs -s 的命令,可以查看到操作当前所有的信号量.
# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x0000007b 100925440 root 600 1 这样就好办了,给自己创建的信号量,但又没有删除的,直接通过相关的命令执行掉就好了.
ipcs -s|perl -nale 'print "ipcrm -s $F[1]" if $F[1] =~ /\d+/'|sh问题解决.