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);
}
IPC之——信号量集的更多相关文章
- IPC之——信号量集(多个信号量)
如果两个进程不仅需要同步,还要保证先后执行顺序,就要用两个信号量(互斥锁)来解决 //栅栏模型:实现以下框架中的四个子进程 所有进程做完任务后 在一起执行下一次 #include <stdio ...
- System V IPC 之信号量
本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...
- Linux IPC 之信号量
信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...
- IPC之信号量
无名信号量 POSIX标准提出了有名信号量和无名信号量来同步进程和线程,而linux(2.6以前)只实现了无名信号量. sem_overview中有详细介绍:man 7 sem_overview. S ...
- IPC进程间通信---信号量
信号量 信号量:信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对于临界资源访问的同步.临界资源可以 理解为在某一时刻只能由一个进程或线程操作的资源,这里的资源可以是一段代码.一个变量或某种 ...
- linux IPC的信号量
信号量相关函数原型 获得一个信号量ID #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h&g ...
- ucos信号量集源码分析
在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量 ...
- μC/OS-II 信号量集
简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...
- 【iCore4 双核心板_uC/OS-II】例程十:信号量集
一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...
随机推荐
- C语言笔记 15_标准库&locale&math&setjmp&signal&stdarg&stddef
<locale.h> 简介 locale.h 头文件定义了特定地域的设置,比如日期格式和货币符号.接下来我们将介绍一些宏,以及一个重要的结构 struct lconv 和两个重要的函数. ...
- Jenkins 插件中心国内镜像源发布
以下文章来源于Jenkins,作者LinuxSuRen Jenkins 社区的网络基础设施都是架设在国外的服务器上,而且,并没有在国内有 CDN 或者负载均衡的配置.对所有的 Jenkins 用户而言 ...
- svnkit-常用api
0.功能列表 svnkit功能列表 1.递归获取指定目录下目录和文件,以树形展示[svn Update] 2.获取指定文件和属性(版本号.作者.日期.文件类型) 3.获取指定文件或目录的历史记录(版本 ...
- git commit 后 尚未push到远程,撤销commit
执行commit后,还没执行push时,想要撤销这次的commit,该怎么办? 解决方案: 使用命令: git reset --soft HEAD^ 这样就成功撤销了commit,如果想要连着add也 ...
- 第二季 第四集 css2
display属性 指定了元素的显示类型 它包含两类基础特征,用于指定元素怎样生成盒模型 外部显示类型定义了元素怎样参与流式布局的处理 外部显示类型 */ display: block; // 独占一 ...
- [转载]matlab视频读取函数VideoReader
看到以前matlab中读取视频多 使用mmreader等(参考<matlab读取/播放视频的函数>),而现在matlab有一个专门的视频读取类VideoReader完成视频读取的功能. 相 ...
- 86.QuerySet API常用的方法详解:get方法
get方法的查询条件只能有一条数据满足,如果匹配到多条数据都满足,就会报错:如果没有匹配到满足条件的数据,也会报错. 示例代码如下: from django.http import HttpRespo ...
- 京东云数据库 RDS助力企业便捷运维
iPhone6发布那年,京东在国贸等商圈送货最快速度数分钟,包括从下单到送达.这是一个极端的富含营销因素例子.即便如此,常态来看,隔天到货的这种业务模式,也是基于同样的支撑:营销业务.物流业务,大数据 ...
- c语言中对指向指针的指针的理解?
/************************************************************************* > File Name: ptr_to_pt ...
- luffy项目:基于vue与drf前后台分离项目(2)
user模块User表 创建user模块 前提:在 luffy 虚拟环境下 1.终端从项目根目录进入apps目录 >: cd luffyapi & cd apps 2.创建app > ...