Linux进程间通信信号量
在多进程的编程环境,进程往往需要共享某些资源,比如共享内存,文件。在多个进程同时对这些共享资源操作时候,可能会引起冲突。为了更好的控制对资源的访问,linux提供了一种成为信号量的机制,首先要认识到PV操作原理。这个是一个荷兰数学家解决一个项目的时候提出来的,为了解决多进程,单处理器条件下进程资源的分配问题。据说灵感来源于火车运行控制里面的信号灯。(semphore)
举个例子什么情况下会出错,假设进程A和进程B都对共享内存内存进行了映射,进程A负责向共享内存写入数据,进程B负责向共享内存读取数据,如果不对读写进程进行控制,可能会出现进程A正在向共享内存写入数据但是尚未写完,此时进程B正好也开始从共享内存读数据,B读到的数据显然不是预期的。
先来看下什么是PV操作,P在荷兰语是“缩写”的第一个字母,V是“释放”的第一个字母,P和V操作都是不可中断的过程,由操作系统保证,计算机内核在接收到中断后会进行中断函数处理,完成后返回原来的位置,一旦执行了P或则V操作任何信号都不能中断,就是忽视中断。
PV操作过程是前提假定存在整形变量sem,PV操作就是对这个数进行加减,没什么难的。
P操作:sem减1,若sem减去1后大于等于0,P操作返回,该进程继续执行。若小于0该进程被阻塞,进入操作系统的阻塞序列。
V操作:sem加1,若结果大于0,P操作返回该进程继续执行,若相加的结果小于或者等于0,从操作系统的阻塞进程的序列唤醒一个在该信号上的进程,然后在返回原进程继续。
Linux系统下的信号量机制在标准的PV操作基础上进行了扩充,主要体现在一下几个方面:
1.支持信号量组,一次可以创建一组信号量,并可以对组内的信号量进行不同操作。
2.每次信号量的PV操作不仅限于对信号量值加1或者减1,而是加减任意整数。
3.支持进程退出时回滚对信号量的修改。
信号的互斥功能能够用于多进程共享某个资源并且可能同时对该项资源进行操作,利用互斥性可以维护资源数据的一致性。也可以实现同步变成,当某个进程A需要等待另一个进程B先执行一些操作才能够执行,这时候可以建立一个信号量初始值为0,表示当前可用资源数目为0,进程A执行时先进行P操作获取资源,此时资源数目为0,A阻塞,B执行时候,首先执行必须的功能代码,然后对信号量调用V操作,信号量值变成1,此时被阻塞的进程A将被激活继续执行。这部分相对以前感觉非常难以理解,还是看代码。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/sem.h>
typedef union semun
{int val;//整形变量,保存信号量值struct semid_ds *buf;//信号控制结构变量指针ushort *array;//无符号短整形指针变量
} SEMCTL_UNION;
int main()
{int n,semid;//信号量标识符,保存信号量的值key_t semkey;//键值SEMCTL_UNION semctl_arg;//共用体变量struct sembuf buf;//进行semop调用时所需要的结构体if((semkey = ftok("/etc/profile",1)) < 0)//生成键值{perror("ftok");exit(1);}if((semid = semget(semkey,1,0)) < 0)//获取信号量标志符,,包含一个信号,第三个参数是0表明获取已经存在的信号量描述符,第二个参数必须和实际的一致{perror("semget");exit(2);}semctl_arg.val = 2;//初始值设置为2if (semctl(semid,0,SETVAL,semctl_arg) < 0)//设置信号量的初始值{perror("semctl");exit(3);}memset(&buf,0x00,sizeof(struct sembuf));//清空结构体buf.sem_num = 0;//信号量在信号量集中的序列,由0开始,代表第一个信号量,这里也就只有一个信号量buf.sem_op = -1;//信号量操作的值buf.sem_flg = IPC_NOWAIT;//非阻塞模式for(n=0;;n++)//循环调用P操作,直到信号量变成0则中断循环{if(semop(semid,&buf,1) == -1)//调用P操作{perror("semop");break;}//获得并且输出信号量的值printf("semop[%d]:current semphore value=%d\n",n,semctl(semid,0,GETVAL,semctl_arg));}return 0;
}
Linux进程间通信信号量相关推荐
- linux 进程间通信-信号量(semagpore)
linux 信号量是一种IPC(Inter-Process Communication)进程间通信,它是System V semagpore ,是一种计数器:代笔了进程对资源的占用和释放:它的实现机制 ...
- Linux 进程间通信 - 信号量
0. 前言 进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程 ...
- Linux进程间通信—信号量
二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()...
我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...
- linux进程间通信:POSIX信号量
文章目录 概念描述 编程接口 注意事项 编程案例 信号量基本接口使用案例 信号量父子进程间通信 信号量实现 两进程之间通信 概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步 本质 ...
- linux进程间通信:system V 信号量 生产者和消费者模型编程案例
生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- Linux环境进程间通信 信号量
信号量与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制.相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志.除了用于访问控制外,还可用于进程 ...
- Linux进程间通信(管道、消息队列、共享内存、信号、信号量)
目录 Linux进程间通信概述 1.管道 无名管道(pipe) 有名管道(fifo) 2.消息队列(msg) 消息队列的通信原理 消息队列相关api 消息队列收发数据 键值生成 消息队列移除 3.共享 ...
最新文章
- 网络安全体系 应用学习手册 下载
- 在asp.net2.0下配置FCKeditor
- 变换编码(DCT)基本理解
- 如何实现阿里云容器镜像服务反向访问代理?
- C语言逗号运算符和逗号表达式
- ---WebCam网络摄像头12 ---图像编码解码,视频编码解码
- 装箱问题(信息学奥赛一本通-T1226)
- Google C++ 编程规范总结
- 本计算机无法加入家庭组,win10系统无法加入家庭组是怎么回事?
- C# 使用 Windows 消息队列机制
- 华为android最新版本下载地址,华为Android手机驱动
- pada aws configuration
- 吉林大学邮箱smtp服务器,吉珠专属EDU邮箱上线,校友也可申请!除了发邮件,这个邮箱还能省钱!...
- 嫌微信公众号排版太丑?这里让你一步到位
- 基于python获取少量图片的简单代码
- 从服务器收到意料之外的响应,WordPress出现“从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。”错误的解决方法...
- java rollback用法,junit/spring-test @Rollback的使用
- R语言swirl教程(R Programming)10——lapply and sapply
- Java 面试题:数据结构 + 算法 +JVM+ 线程 +finalize+GC
- paypal php接口 下载,PayPal接口集成之:PHP集成PayPal标准支付接口