IPC之——信号量集(多个信号量)
如果两个进程不仅需要同步,还要保证先后执行顺序,就要用两个信号量(互斥锁)来解决
//栅栏模型:实现以下框架中的四个子进程 所有进程做完任务后 在一起执行下一次
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <signal.h>
#define PROCESS_NR 4
void sigFunc(int signo)
{
int semId;
semId=semget(0x555,PROCESS_NR+1,IPC_CREAT|0600);
if(semId>0){
semctl(semId,0,IPC_RMID);
}
exit(1);
}
void p_lock(int idx,int semId);
void waitZero(int semId);
void doWork(int idx,int semId);
int main(void)
{
int semId,i;
pid_t pid;
////////////////////////////////
//对应的下标的信号量控制对应的子进程 最后一个信号量控制父进程
semId=semget(0x555,PROCESS_NR+1,IPC_CREAT|0600);
if(semId==-1)
{
perror("create sem");
return 11;
}
//init sem value
unsigned short vals[PROCESS_NR+1]={0};//对多个信号量值进行初始化
if(semctl(semId,0,SETALL,vals)==-1)
{
perror("init sem val");
semctl(semId,0,IPC_RMID);
return 12;
}
////////////////////////////////
for(i=0;i<PROCESS_NR;i++)
{
pid=fork();
if(pid==-1) return 1;
else if(pid==0)//child process
{
doWork(i,semId);//i标识进程的编号
exit(0);
}
}
//
signal(SIGINT,sigFunc);
//parent
struct sembuf bufs[PROCESS_NR+1]={0};
for(i=0;i<PROCESS_NR;i++)//子进程
{
bufs[i].sem_num=i;
bufs[i].sem_op =1;
}
bufs[PROCESS_NR].sem_num=PROCESS_NR;//父亲的资源
bufs[PROCESS_NR].sem_op =PROCESS_NR;
////////////////////////////////////////
while(1)
{
waitZero(semId);
printf("========升起栅栏=======\n");
semop(semId,bufs,PROCESS_NR+1);
}
while(wait(NULL)!=-1)
;//empty
return 0;
}
void doWork(int idx,int semId)
{
pid_t pid=getpid();
int sec;
srand(pid);
while(1)
{
p_lock(idx,semId);
sec=rand()%10+1;
printf("%dth Do [%d] sec:%d\n",idx,pid,sec);
//随机休眠1-10s 模拟不同进程不同时侯做事情可能需要不同的时长
sleep(sec);
//通知父进程 该子进程已执行完毕
p_lock(PROCESS_NR,semId);
}
}
////////////////////////////////////////
void p_lock(int idx,int semId)
{
struct sembuf buf={.sem_num=idx,.sem_op=-1};
semop(semId,&buf,1);
}
void waitZero(int semId)
{
struct sembuf buf={.sem_num=PROCESS_NR,.sem_op=0};
semop(semId,&buf,1);
}
IPC之——信号量集(多个信号量)的更多相关文章
- ucos信号量集源码分析
在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量 ...
- IPC之——信号量集
信号量集用于对存在竞争的资源加锁 1.semId=semget(key,nsems,semflg) key:为信号量集名称,可以指定为0455等数字,也可以为PC_PRIVATE nsems:创建几个 ...
- μC/OS-II 信号量集
简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...
- 【iCore4 双核心板_uC/OS-II】例程十:信号量集
一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...
- FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组,任务消息邮箱
以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Not ...
- FreeRTOS 二值信号量,互斥信号量,递归互斥信号量
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节讲解 FreeRTOS 任务间的同步和资源共享机制,二值信号量. 二值信号量是计数信号量的一种特殊形式 ...
- RT-Thread信号量使用(动态/静态信号量) 及 信号量的四种使用场合
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦该关键代码段完成了 ...
- UCOSII笔记---信号量、邮箱、消息队列、信号量集、软件定时器
一.接收邮箱函数的参数:timeout表示的是滴答定时器的节拍数,比如设定5ms为一个节拍,超时为100ms,则timeout=20. void *OSMboxPend (OS_EVENT *peve ...
- Linux进程间通信:IPC对象——信号灯集详解
作者:倪老师,华清远见嵌入式学院讲师. 一.信号灯概述 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制.相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时 ...
随机推荐
- 18 12 4 SQL 的基本 语法
数据库的基本语法 -- 数据库的操作 -- 链接数据库 mysql -uroot -p mysql -uroot -pmysql -- 退出数据库 exit/quit/ctrl+d -- sql语句最 ...
- FFmpeg的基本使用
1.FFmpeg理解 (1)FFmpeg是一个视屏.音频编码工具 (2)x项目名称mpeg来源mpeg编码标准,但不局限只能使用mpeg编码标准.FF 表示fast forward (3)被广泛使用. ...
- SpringCloud学习之Hystrix请求熔断与服务降级(六)
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- HALCON形状匹配讲解
HALCON形状匹配讲解 https://blog.csdn.net/linnyn/article/details/50663328 https://blog.csdn.net/u014608071/ ...
- 冲刺期末阶段一<公文档案流转管理系统>
今天下午的四节课要求自己完成公文流转管理系统,并规定时间看个人进程,相对来说我对增删改查掌握的不彻底,对项目的逻辑框架不太熟练,所以我感觉今天的进度有点慢.有待继续学习. 完成进度:1.分步骤先理清整 ...
- Django2.0模型基础——(一)
Django模型封装python操作数据库的代码,让我们可以更加方便的执行SQL语句.每个创建的app下都会有一个叫models.py的文件,在这个文件下创建的模型类映射于数据库的表名,类属性映射于数 ...
- linux文件软链接与硬链接
1.命令格式: ln [参数][源文件或目录][目标文件或目录] 软链接只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间. 2.命令功能: Linux文件系统中,有所谓的链接(link),我们 ...
- 备战秋招——C++知识点
1.字符串的末尾'\0'也算一个字符,一个字节. 2.使用库函数strcpy(a,b)进行拷贝b->a操作,strcpy会从源地址一直往后拷贝,直到遇到'\0'为止.所以拷贝的长度是不定的.如果 ...
- python——logging模块
简介: 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.不同的事件,被区分在不同的等级中,故通过log分析,可以很轻易地分析 ...
- myeclipse跟tomcat的同步
一般来说,我们在myeclipse里把文件内容改了并保存之后,直接刷新网页就可以非常直观的看到内容的改变. 这是因为myeclipse检测到文件内容的变动,及时地把新的文件部署到了tomcat上. m ...