Linux c 信号量
信号量(通过进程通信实现进程间的同步)
信号量(semaphore)信号灯
信号量是共享内存整数数组.根据需要定义指定的数组长度
信号量就是根据数组中的值,决定阻塞还是解除阻塞
编程模型:
1. 创建或者得到信号量 semget
2. 初始化信号量中指定下标的值 semctl
3. 根据信号量阻塞或者解除阻塞 semop
4. 删除信号量 semctl
案例:
A: B:
创建信号量 得到信号量
初始化信号量 解除阻塞
根据信号量阻塞
删除信号量
int semget(key_t key,
int nums,//信号量数组个数
int flags);//信号量的创建标记
//创建IPC_CREAT|IPC_EXCL|0666
//打开0
返回: -1:失败
>=0:成功返回信号量的ID
int semctl(int semid,
intnums,//对IPC_RMID无意义
intcmd,//SETVAL(信号量值) IPC_RMID
...);//对IPC_RMID无意义
参数:
semid:信号集的标识符,即是信号表的索引。
semnum:信号集的索引,用来存取信号集内的某个信号。
cmd:需要执行的命令,有效值有 需要使用联合体semun赋值
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};//需要自己定义该联合体,根据需要定义,需要那个字段就可以只定义那个
int semop(
int semid,//信号量ID
struct sembuf*op,//对信号量的操作.操作可以是数组多个
size_tnums,//第二个参数的个数
);
返回:
-1:时失败
0:成功
struct sembuf
{
int sem_num;//下标
int sem_op;
int sem_flg;//建议为0.
}
sem_op:
前提条件信号量是unsigned short int;
不能<0.
-:够减,则semop马上返回,不够减,则阻塞.
+:执行+操作
0:判定信号量>0,则阻塞,直到为0
控制进程的搭配方式:
+(解除阻塞) -(阻塞)
0(阻塞) -(解除阻塞)
代码:
semA:
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
#include<signal.h>
int semid;
void deal(int s)
{
//4.删除信号量
printf(“删除信号量…”);
semctl(semid,0,IPC_RMID , 0);
printf(“信号量已删除”);
exit( -1 );
}
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
void main()
{
key_t key;
union semun v; //2.2定义初始化值
int r;
//3.1定义一个操作结构体
struct sembuf op[1]; //定义了两个操作
signal(SIGINT , deal);
//1.创建信号量
key=ftok(“.” , 99);
if(key == -1) printf(“ftok err :%m\n”) ,exit(-1);
semid=semget(kay,1 /*信号量数组个数*/ , IPC_CREAT | IPC_EXCL | 0666);
if( semget == -1) printf(“get err %m\n”) ,exit(-1);
//2.初始化信号量
//2.1定义一个联合体
v.val=2;
r=semctl(semid , 0 , SETVAL , v); //设置信号量的值
if(r== -1) printf(“初始化失败:%m\n”) , exit(-1);
//3.对信号量阻塞操作
op[0].sem_num=0; //信号量的下标
op[0].sem_op= 1; //信号量操作单位与类型
op[0].sem_flg=0; //操作标记 IPC_NOWAIT(信号量值够不够减都返回 不阻塞)
//SEM_UNDO 建议为0;
while(1)
{
r=semop(semid , op ,1);
printf(“信号量阻塞-1”);
}
}
//semop操作减一 ,信号量值大于0,semop执行返回,信号量值等于0时,semop操作阻塞等待,直到信号量值大于0,在进行该操作
semB:
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<stdlib.h>
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
void main()
{
int semid;
key_t key;
int r;
//3.1定义一个操作结构体
struct sembuf op[1]; //定义了两个操作
signal(SIGINT , deal);
//1.得到信号量
key=ftok(“.” , 99);
if(key == -1) printf(“ftok err :%m\n”) ,exit(-1);
semid=semget(kay,1 /*信号量数组个数*/ ,0);
if( semget == -1) printf(“get err %m\n”) ,exit(-1);
//3.对信号量阻塞操作
op[0].sem_num=0; //信号量的下标
op[0].sem_op= +1; //信号量操作单位与类型
op[0].sem_flg=0; //操作标记 IPC_NOWAIT(信号量值够不够减都返回 不阻塞)
//SEM_UNDO 建议为0;
while(1)
{
r=semop(semid , op ,1);
sleep(1);
}
}
//进程semA进行信号量阻塞-1 semB进行信号量接触阻塞+1 , semB进程控制semA进程的执行
Linux c 信号量的更多相关文章
- linux进程间通信-信号量(semaphore)
一 为什么要使用信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问 代码的临界区域.临界区域是指执 ...
- Linux进程间通信--信号量
信号量绝对不同于信号,一定要分清,关于信号,上一篇博客中已经说过,如有疑问,请移驾! 信号量 一.是什么 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件 ...
- linux ipc信号量
ipcs 命令,可以看到当前系统上的共享资源实例 ipcrm 命令,可以删除一个共享资源实例 linux 操作信号量的函数有三个:semget, semop, semctl semget 声明为: # ...
- Linux有名信号量的创建(sem_open中name参数构造)【转】
转自:http://blog.csdn.net/gfeng168/article/details/40740865 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.sem_open函数nam ...
- Linux中信号量处理
参考文章: http://blog.csdn.net/qinxiongxu/article/details/7830537/ 信号量一. 什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个 ...
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- linux 内核信号量
Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干. 信号量在创建时需要设置一个 ...
- Linux进程间通信—信号量
二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...
- linux下信号量可设值的函数操作
#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <errno.h ...
随机推荐
- java中关于窗体居中显示问题
最近在学着用java写qq聊天程序,首先是登录和聊天界面,书上没有给出居中显示,通过上网查找知道有两种方案 先说第一种方法,也是以前用的方法 /获得屏幕大小Dimension screenSize = ...
- knockoutjs简单使用
knockoutjs是一个不错的前端MVVM框架,极大的减轻了前端工作开发量,增加前端代码的维护性.主要特点:声明式绑定.依赖跟踪.模块开速开发. 如下代码(官方代码稍做修改) <p> 姓 ...
- jQuery获取iframe的document对象
$(function() { var result = $('#myframe').prop('contentWindow').document; console.log(result); }); 这 ...
- Jquery 解决 H5 placeholder元素问题
<style type="text/css"> .placeholder{ color: #cacaca; } </style> <script ty ...
- 通过读取excel数据和mysql数据库数据做对比(一)-win环境准备
要想操作excel和mysql首先需要安装python,然后是安装excel和mysql插件: 第一步安装python: 直接百度搜索,下载安装就可以了. 第二步安装excel插件: 首先到这个htt ...
- 处理json中的异常字符
在很多场景中需要通过json传递数据,如果json中包含英文的",""'"之类的字符,会导致json解析失败 可以用一些在线的json格式检查网站检查是否含有异 ...
- Delphi 进阶基础技能说明
以下讨论均基于Delphi XE8,主要是利用DELPHI新版的功能,如:Unicode,泛型,匿名函数等[XE2 后应该都支持]. 用新特性的好处是少写代码,提高效率.本博客不再讨论Delphi旧版 ...
- C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0
原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0 前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题. ...
- Firebug入门指南(转)
据说,对于网页开发人员来说,Firebug是Firefox浏览器中最好的插件之一. 我最近就在学习怎么使用Firebug,网上找到一篇针对初学者的教程,感觉比较有用,就翻译了出来. 作者:Estell ...
- Sass 的基本语法规则
转自:http://www.cnblogs.com/qqloving/p/3676852.html 自从发现可编程的css语法 Sass和基于Sass的css库compass 一个给我的感觉像c# 另 ...