(1)查看所有信号
ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x00008708 0 root 666 1
0x000086f8 217120769 root 666 1
0x0000870a 65538 root 666 1
0x00008707 98307 root 666 1
0x00008709 131076 root 666 1
0x00008706 163845 root 666 1
0x0000870b 196614 root 666 1
(2)查看指定信号信息 -i
# ipcs -s -i 249823287
Semaphore Array semid=249823287
uid=0 gid=0 cuid=0 cgid=0
mode=0666, access_perms=0666
nsems = 1
otime = Not set
ctime = Thu Aug 15 14:25:08 2013
semnum value ncount zcount pid
0 0 1 0 0
# sysctl -a|grep sem
kernel.sem = 250 1024000 32 4096
查看当前信号量系统限制
# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 4096 <------ 系统允许的 【信号集数组】 最大个数
max semaphores per array = 250 <------ 允许每个信号集数组管理多少个信号量, 信号数组包含多个信号
max semaphores system wide = 1024000 <----- 系统创建【信号量】最大数, 该值等于 (max number of arrays) * (max semaphores per array)
max ops per semop call = 32 <------- 每次semop操作的时候设置sem_op最大值
semaphore max value = 32767 <------- 信号量最大值
可以通过下面命令临时修改:
echo "5010 641280 5010 128" > /proc/sys/kernel/sem
(3)测试
测试1 (没有设置SEM_UNDO)
测试程序如下:
int main(int argc, char * argv[])
{
int nRet = 0;
int sem_id = 0;
Semaphore sem;
nRet = sem.create(0x112233, sem_id);
if(nRet)
{
nRet = sem.open(0x112233, sem_id);
}
sem.acquire(); //sops[0].sem_flg = 0,没有指定 SEM_UNDO
while(true)
{
sleep(5);
}
return nRet;
}
程序执行完信号量代码后查看信号量信息, value=0, 正常
root@PLATDEV:~# ipcs -s -i 249921584
Se