IPC信号量 sem

本文通过一系列测试详细介绍了Linux中IPC信号量的使用,特别是SEM_UNDO标志的影响。当SEM_UNDO未正确使用时,可能导致信号量资源泄漏,影响后续进程。测试表明,SEM_UNDO应在信号量的获取和释放时成对使用,以确保资源的正确管理。
摘要由CSDN通过智能技术生成


(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值