linux信号量初识
以下程序使用信号量控制程序运行
“信号”量
“变”量
/*信号量(semaphore)是变量,是一种特殊的变量。它仅取正值。
对信息号量的操作只有2种:等待(wait)和发送信号(signal)*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <errno.h>
#define IPCKEY 0x111
#define LOCKFILE "/home/liuyi/comm/1.lock"
/*ftok的生成的key值依赖IPCKEY和LOCKFILE生成*/
/*arg for semctl systemcalls.*/
union semun {
int val;/*value for SETVAL*/
struct semid_ds *buf;/*buffer for IPC_STAT&IPC_SET*/
unsigned short *arrary;/*array for GETALL&SETALL*/
};
/*结构体说明
struct sembuf
{
unsigned short sem_num;
操作信号在信号集中的索引,第一个信号的索引是0
short sem_op;
如果其值为正数,
该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;
如果sem_op的值为负数,会减去改信号内含的相应值,而其绝对值又大于信号的现值,
操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;
如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
short sem_flg;
信号操作标志,
IPC_NOWAIT 对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息
SEM_UNDO 程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。
这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。
(重要的地方)
}; */
int main()
{
key_t key;
int sem_id;
union semun options;
struct sembuf lock_it;/*sembuf见说明*/
key = ftok(LOCKFILE,IPCKEY);
printf("key=[0x%x]\n",key);
sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0666);/*创建信号量集*/
/*key,刚才ftok产生的,若指定IPC_PRIVATE,则由系统分配。*/
/*1,信号量集中多少个信号量。*/
/*IPC_CREAT如果信号量集在系统内核中不存在,则创建信号量集。
IPC_EXCL当和 IPC_CREAT一同使用时,如果信号量集已经存在,则调用失败。*/
/*0666,该信号权限为666*/
/*ps:可以用ipcs –s命令来查看是否创建成功。ipcrm -s semid号来删除指定的信号量集。*/
printf("创建信号量集ID为[%d]\n",sem_id);
if(sem_id<0)
{
printf("信号量已经存在\n");
sem_id = semget(key,1,IPC_CREAT|0666);/*已经存在信号量集,取得信号量集ID*/
if(-1 == sem_id)
{
printf("取已存在的信号量集ID错误\n");
exit(-1);
}
printf("已存在的信号量集ID为[%d]\n",sem_id);
}
else
{
options.val =1;/*设信号量集中的 那个信号量值为1*/
semctl(sem_id,0,SETVAL,options);/*操作信号量集,SETVAL这里表示设置值*/
/*sem_id:信号量ID,也就是semget函数的返回值*/
/*0:要操作信号量在信号量集中的索引,从0开始*/
/*SETVAL:操作类型,SETALL设置信号量集中的所有的信号量的值,
SETVAL设置信号量集中的一个单独的信号量的值。等等*/
/*options:要设定信号量集中的信号量值 的联合体,可选*/
}
printf("信号集ID sem_id=[%d] \n",sem_id);
int i = semctl(sem_id,0,GETVAL);/*获取索引为0的位置的信号量的值*/
printf("1索引为0的位置的信号量的值为[%d]\n",i);
lock_it.sem_num =0; /*索引*/
lock_it.sem_op = -1;/*设成-1,就是将信号量的值减去1*/
lock_it.sem_flg = SEM_UNDO;/*程序结束后还原信号量的值*/
semop(sem_id,&lock_it,1);/*操作信号量,使信号量的值减去abs(lock_it.sem_op)*/
/*ps:如果当前信号量的值小于abs(lock_it.sem_op),会阻塞,直到当前信号量的值不
小于abs(lock_it.sem_op)时候才会执行(靠外部程序改变当前信号量的值)*/
i = semctl(sem_id,0,GETVAL);/*打印操作后的信号量值*/
printf("2索引为0的位置的信号量的值为[%d]\n",i);
/*这里开始就是你干的私活了*/
int j;
scanf("%d",&j);
printf("finish\n");
return 0;
}
linux信号量初识的更多相关文章
- Linux信号量详解
1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...
- Java中处理Linux信号量
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5976361. ...
- Linux信号量同步共享内存实验.
Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...
- Linux入门——初识Linux
Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...
- linux信号量之进程间同步
概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...
- Linux 信号量同步编程
前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它 ...
- Linux 信号量互斥编程
所谓信号量,其实就是一个数字.内核给这个数字赋予一定的含义,让它等于不同的值时所表示的意义不同.这样就可以用它来标示某种资源是否正被使用.信号的分类其实挺多的,主要还是二值和计数器.这里讨论二值 现在 ...
- [转] linux 信号量之SIGNAL
我们可以使用kill -l查看所有的信号量解释,但是没有看到SIGNAL 0的解释. [root@testdb~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) ...
- linux信号量与完成量
信号量: 是用于保护临界区的一种常用方法,它的使用和自旋锁类似.与自旋锁相同,只有得到信号量的进程才能执行 临界区的代码.但是与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等 ...
随机推荐
- 本地git仓库常用操作
SSH配置: 本机创建SSH key $ ssh-keygen -t rsa -C "youremail@example.com" 将SSHkey添加到git仓库:id_rsa.p ...
- 创建DataSnap Server
DataSnap REST Application http://edn.embarcadero.com/article/41305 2017.1.19 官方例子 https://community. ...
- VB6 MsgBox 函数
在对话框中显示消息,等待用户单击按钮,并返回一个值指示用户单击的按钮. MsgBox(prompt[, buttons][, title][, helpfile, context]) 参数 promp ...
- Invalid args, too big block
在调试vs程序的时候 查看log 会出现下面几行log: [9064] Error - [9064] Invalid args, too big block[9064] [9064] Error - ...
- <!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false -->& vh 属性
1.<!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false --> 2. vh 分享到选择其它项 复制本页链接 版本:CSS3 补 ...
- SQL语言类别
SQL语言主要分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL. DQL (data query language) DML(data manipulati ...
- redis启动.停止.重启
Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# tar xzf redis-2.8.17.tar.g ...
- R及Rstuio下载及配置,及基本使用介绍
1.R和Rstudio下载地址 https://cran.rstudio.com/a 2.Rstudio 的配置 外观.代码显示比例配置 选中tools 选中globle options 选中appe ...
- IIS7配置下载apk以及目录浏览
IIS7为了增加安全性,如果需要禁止目录浏览.只需要按下面的步骤执行就可以 1.选择站点:2.选择功能视图:3.选择IIS下面的目录浏览:4.在右上角的操作中选择“打开功能”:5.选择右边的禁用. 今 ...
- JSP页面与JSP页面之间传输参数出现中文乱码的解决方案
在学习编程初期JSP与JSP页面之间传输参数大多数都是使用这样的方式 index.jsp?id=*&name=* 这样的传输方式实质上是一种GET传输方式, 那如果出现了中文乱码, 解决方法其 ...