判断sem信号量为零_信号量(sem)
一、信号量:(数据操作锁)控制进程间互斥、同步等,协调多个程序同时访问一个共享资源。
工作原理:信号量只能有两种操作等待和操作,即:P V操作,必须是原子操作。
P(sv):如果 sv 的值大于零就减一;如果它的值为零,就挂起;
V(sv):如果有被挂起的,恢复运行,如果没有就加一。
二、函数原型:
int semget(key_t key, int nsems,int semflg);
int semop(int semid,struct sembuf *sops,size_t nsops);
int semctl(int semid, int semnum, int cmd, ...);
/*
* semid:信号量集的标识符; semnum:第几个信号量;
* cmd:需要执行的命令,根据命令的不同,函数有三个或四个参数(union)
*/
cmd:IPC_RMID,立即删除信号集,唤醒被阻塞的进程;
cmd:SETVAL,设置信号量集中的一个单独的信号量的值。
cmd:GETALL用于读取信号量集中的所有信号量的值。
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};//用户需自己定义声明
struct sembuf
{
unsigned short sem_num;
short sem_op;
short sem_flg;
};
三、代码实现:
//sem.h#pragma once
#include
#include
#include
#include
#include
#include
#include
#define _PATH_ "."
#define _ID_ 0x666
static int op_sem(int sem_id, int op, int which);
int creat_sem(int _sem_num);
int get_sem();
int init_sem(int _sem_id, int _which);
int sem_p(int _sem_id, int _which);
int sem_v(int _sem_id, int _which);
int destroy_sem(int _sem_id);
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
//sem.c#include"sem.h"
int creat_sem(int snum)
{
int flags = IPC_CREAT|IPC_EXCL|0666;
key_t key = ftok(_PATH_, _ID_);
if(key
{
perror("ftok");
return -1;
}
return semget(key, snum, flags);
}
int get_sem()
{
key_t key = ftok(_PATH_, _ID_);
if(key
{
perror("ftok");
return -1;
}
return semget(key, 0, IPC_CREAT);
}
static int op_sem(int sem_id, int op, int which)
{
struct sembuf sem;
memset(&sem, '\0',sizeof(sem));
sem.sem_num = which;
sem.sem_op = op;
sem.sem_flg = 0;
if(semop(sem_id, &sem, 1)
{
perror("semop");
return -1;
}
return 0;
}
int sem_p(int sem_id, int which)
{
return op_sem(sem_id, -1, which);
}
int sem_v(int sem_id, int which)
{
return op_sem(sem_id, 1, which);
}
int init_sem(int sem_id, int which)
{
union semun _semun;
_semun.val = 1;
if(semctl(sem_id, SETVAL, which, _semun)
{
perror("semctl");
return -1;
}
return 0;
}
int destroy_sem(int sem_id)
{
if(semctl(sem_id, 0, IPC_RMID, NULL)
{
perror("semctl");
return -1;
}
return 0;
}
//test.c#include"sem.h"
int main()
{
int sem_id = creat_sem(1);
if(sem_id
{
printf("creat_sem error");
return -1;
}
init_sem(sem_id, 0);
pid_t id = fork();
if(id
{
perror("fork");
return -1;
}
else if(id == 0)
{
int sem_id = get_sem(1);
while(1)
{
sem_p(sem_id, 0);
printf("A");
sleep(1);
fflush(stdout);
printf("A");
sleep(2);
fflush(stdout);
sem_v(sem_id, 0);
}
}
else
{
while(1)
{
sem_p(sem_id, 0);
printf("B");
fflush(stdout);
printf("B");
sleep(1);
fflush(stdout);
sem_v(sem_id, 0);
}
waitpid(id, NULL, 0);
destroy_sem(sem_id);
}
return 0;
}
四、实现结果:
使用信号量之前
使用信号量之后
判断sem信号量为零_信号量(sem)相关推荐
- 判断sem信号量为零_将信号量递减为零的进程崩溃时,如何恢复信号量?
我有多个使用g ++编译的应用程序,它们在Ubuntu中运行.我正在使用命名信号量来协调不同进程之间的关系. 除非 出现以下情况, 否则 所有方法都可以正常工作:如果其中一个进程调用sem_wait( ...
- 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量
信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 判断sem信号量为零_kernel.sem信号量调优
一.kernel.sem 信号量 sem其实是semaphores的缩写,这个在oracle数据库配置的时候,会需要调整该值,对于一般的程序来说基本是用不到的.不过现网中也遇到过个别主机上zabbix ...
- alios thing 信号量_信号量_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...
对于多任务,甚至多核的操作系统,需要访问共同的系统资源.共享资源包括软件资源和硬件资源,软件共享资源主要是共享内存,包括共享变量.共享队列等等,硬件共享资源包括一些硬件设备的访问,例如:输入/输出设备 ...
- java 信号量 互斥锁_线程同步(互斥锁与信号量的作用与区别)
"信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一 ...
- Java Review - 并发编程_ 信号量Semaphore原理源码剖析
文章目录 概述 小Demo 类关系概述 核心方法源码解读 void acquire() 非公平策略NonfairSync类的`tryAcquireShared`方法 公平策略`FairSync`类的` ...
- Linux信号量之用户态信号量(Posix信号量->无名信号量)
相关API: 1.初始化信号量 int sem_init(sem_t* sem,int pshared,unsigned int value); //pshared为信号量最多由几个进程共享.Linu ...
- linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用
[摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...
最新文章
- 使用聚类算法进行标签传播学习(Clustering for Semi-Supervised Learning)
- 《战狼2》中人脸识别无人机表现不俗,军、警用果真如此高能?
- Jenkins持续集成环境之插件管理和角色管理
- VTK:PolyData之MiscCellData
- centos 安装 redmine 2.1.4
- 获取网页中选中的文字
- 数字高程模型和地图——thematicmapping.org译文(一)
- 【OpenCV】透视变换 Perspective Transformation
- 开源公司黄页之 Google 开源软件推荐
- 理解Java主函数中的String[] args
- python terminal_一个简单、易用的Python命令行(terminal)进度条库
- 信道模型时延和路径增益:cost207,cost2100,cost259,cost273,SCM,I-METRA,WINNER II
- 各种PLC和触摸屏解密软件大全
- Mysql里有2000w数据,redis中只存20w数据,如何保证redis中的数据都是热点数据
- 南通大学《构建之法》课程助教总结
- innerHTMLinnerText区别
- FinalShell显示文件夹
- html5两个标签重叠,css中两个盒子如何重叠?
- excel表格数据汇总计数如何完成?
- Java实现 LeetCode 48 旋转图像
热门文章
- React中useMemo的简单使用
- 文章翻译—基于误差状态卡尔曼滤波器的四元数运动学—前言
- windowsNote(小便签)
- Extrinsic Calibration of a Camera and Laser Range Finder (improves camera calibration)阅读笔记
- 谢少荣到计算机学院,我校校友谢少荣应邀回母校交流并受聘顾问教授
- 2021泰安高考成绩排名查询,泰安高中学校排名2021最新排名,泰安高中排名前十
- Win7 easy connect 提示:选路连接失败,可能当前连接网络异常,请稍后重试
- dell 7040m 黑苹果_感受下价值三千多的移动硬盘:Dell移动Thunderbolt? 3固态硬盘
- 本人有一个60G的金士顿的固态硬盘,测了4K分区对齐前后的区别,发现性能相差很大...
- 今天心情不错,写个随笔。