IPC之——信号量集
信号量集用于对存在竞争的资源加锁
1.semId=semget(key,nsems,semflg)
key:为信号量集名称,可以指定为0455等数字,也可以为PC_PRIVATE
nsems:创建几个信号量
semflg:创建并给权限,如(IPC_CREAT | 0600);
2.semctl(semId,semnum,cmd,...)//
2.1初始化信号量集
semctl(semId,num,SETVAL,1) 将semId的第num个信号量设置为1;semvalue
2.2删除信号量集
semctl(semId,0,IPC_RMID) 删除信号量集semId
.......
3. 锁的操作
semop(semId,&buf,1)/////能做则做,不能做则阻塞等待
锁操作是将要操作的信号放到一个结构体中 struct sembuf buf;
buf.sem_num:对第几个信号操作
buf.sem_op: 有三种情况 大于0(释放资源) 小于0(申请资源) 等于0(等0操作)
buf.sem_flg: 是否阻塞
semop(semId,&buf,1);操作1个这样的buf
·
semtimeop()//能做则做,不能做则阻塞一段时间后返回,常用于超时等待
代码示例
//等零操作:子进程执行10次 父进程执行一次
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#define NR 1
int p_lock(int semId);
void v_unlock(int semId);
void w_zero(int semId);
int main(void)
{
int semId,ret;
pid_t pid;
semId=semget(IPC_PRIVATE,NR,0600);
if(semId==-1)
{
perror("semget");
return 1;
}
//init sem value
ret=semctl(semId,0,SETVAL,0);
if(ret==-1)
{
perror("set sem val");
semctl(semId,0,IPC_RMID);
return 2;
}
//create child process 继承semId
pid=fork();
if(pid==-1)
{
semctl(semId,0,IPC_RMID);
perror("fork");
return 3;
}
else if(pid==0)//child
{
int count=1;
while(1)
{
p_lock(semId);
printf("child do %dth\n",count);
count++;
sleep(1);
}
exit(0);
}
//aprent
while(1)
{
w_zero(semId);
printf("parent do....\n");
v_unlock(semId);
}
wait(NULL);
semctl(semId,0,IPC_RMID);
return 0;
}
int p_lock(int semId)
{
struct sembuf buf[1];
buf[0].sem_num=0;//第几个
buf[0].sem_op =-1;//怎么操作(1.op>0 指释放资源 2.op<0 申请资源 3.op==0等大资源为0)
buf[0].sem_flg=0; //IPC_NOWAIT
return semop(semId,buf,1);
}
void v_unlock(int semId)
{
struct sembuf buf;
buf.sem_num=0;//第几个
buf.sem_op =10;//怎么操作(1.op>0 指释放资源 2.op<0 申请资源 3.op==0等大资源为0)
buf.sem_flg=0; //IPC_NOWAIT
semop(semId,&buf,1);
}
void w_zero(int semId)
{
struct sembuf buf;
buf.sem_num=0;//第几个
buf.sem_op =0;//怎么操作(1.op>0 指释放资源 2.op<0 申请资源 3.op==0等大资源为0)
buf.sem_flg=0; //IPC_NOWAIT
semop(semId,&buf,1);
}
最新文章
- vim自动补全功能
- 浅尝辄止——使用ActiveX装载WPF控件
- 什么是P3O?
- HTML图片元素(标记)
- 如何快速读懂大型C++程序代码
- ssh 配置自动登录
- scala集合
- source insight新建工程,添加文件时出现“no files found”
- Spark生态之Spark Core
- Drawable(2)State list Drawable Resource介绍
- A Knight&#39;s Journey(dfs)
- PID38 串的记数(codevs2077)
- Ubuntu12.04 下配置tomcat
- 导入虚拟机vmware,此主机支持Intel VT-x,但Intel VT-x处于禁用状态和黑屏
- 金融量化分析【day112】:量化平台的使用-第一个策略
- mybatis 插入数据 在没有commit时 获取主键id
- 解决IDEA授权报错
- 最短路径遍历所有的节点 Shortest Path Visiting All Nodes
- Jmeter-安装与配置
- android 中遇到 imageView getWidth 始终为0 时 ,设置 setImageBitmap 的方法