system V IPC

1)消息队列

2)共享内存

3)信号灯(信号量集)

1.消息队列、

  ipcs -q 查看系统中使用消息队列的情况

  ipcrm -q +msqid 删除消息队列

  消息队列工作原理:在内核空间上创建队列,信息发送者将发送信息打包成结点添加到队列中,信息的接受者选择性从队列上读取想要的节点

  1)创建队列,2)向队列中添加信息,3)从队列中移除信息,4)实现队列的控制(获取队列的属性,设置队列的属性,删除不使用的队列)

  1)创建队列:

      函数原型:key_t ftok(const char *pathname,int proj_id);

      功能  :生成key值

      参数  :pathname 路径名(用户给定,路径必须真实存在)

            proj_id 传字符

      返回值:成功  key值  随机数

          失败:-1

      函数原型:intmsgget(key_t key,int msgflg);

      功能:  创建消息队列

      参数:  key 值  0或非0  key值确保消息队列的唯一性

            msgflg   标志位    IPC_CREAT|IPC_EXCL|0664    创建并打开消息队列(如果消息队列不存在,自动创建,如果存在,返回EEXIST)

                        0664     按该权限打开消息队列。

      返回值:成功:  消息队列标识符

          失败   -1

  2)添加消息

    函数原型:int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

    功能  :将消息添加到队列的末尾

    参数  :msqid  消息队列的标识符

          msgp  发送的消息

            struct msgbuf{

                  long mtype;  消息的类型

                  char mtext[1];  消息的征文

                };

          msgsz 消息征文的大小

          msgflg  0  消息队列没空间,写操作阻塞

    返回值  : 成功:0;失败:-1;

  3)将消息从队列中移除

     函数原型:ssize_t masrcv(int msqid,void *msgp,size_t msgsz,long msgtype,int msgflg);

     参数  :msqid 消息队列标识符

          msgp  保存接受的消息(定义和写入时保持一致)

          msgsz  消息正文的大小

          msgtype 消息的类型    0  读取消息队列中的第一个消息

                      >0    读取消息队列中类型为msgtype 的第一个消息

                      <0     读取消息队列中不小于msgtype 的绝对值,且类型最小的第一个消息

          msgflg    0  消息队列中无数据,读操作阻塞

      返回值:成功  消息正文的大小

          失败  -1

  4)对消息队列的控制

      函数原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);

      功能  :实现对消息队列的控制

      参数  :msqid 消息队列的标识符

          :cmd  制定消息队列的操作处理

              IPC_STAT   从第三个参数读取消息队列的属性信息

              IPC_SET  设置消息队列的属性

              IPC_RMID  删除消息队列

          :buf  描述消息队列属性的结构体          

struct msqid_ds {

struct ipc_perm msg_perm; /* Ownership and permissions */ 消息队列的权限
time_t msg_stime; /* Time of last msgsnd(2) */ 消息队列发送消息的时间
time_t msg_rtime; /* Time of last msgrcv(2) */ 消息队列接受消息的时间
time_t msg_ctime; /* Time of last change */ 消息队列改变的时间
unsigned long __msg_cbytes; /* Current number of bytes in
queue (nonstandard) */ 消息队列当前的字节数
msgqnum_t msg_qnum; /* Current number of messages
in queue */ 消息队列当前消息的个数
msglen_t msg_qbytes; /* Maximum number of bytes
allowed in queue */ 消息队列最大的字节数
pid_t msg_lspid; /* PID of last msgsnd(2) */ 发送消息的用户ID
pid_t msg_lrpid; /* PID of last msgrcv(2) */ 接收消息的用户ID

};

返回值:成功 0
失败 -1

实现两个终端数据交互(创建子进程)

2.共享内存

  工作原理:系统为每一个进程创建4G的虚拟地址空间,共享内存开辟一块实际的物理内存区域(共享内存区域)将该区域映射给每一个进程

  本质  :多进程实际都是在访问同一块物理内存区域

   其通信效率最高,适用场合:实现实时数据传输

   多进程访问同一块物理内存区域,容易产生竟态,共享内存结合同步互斥机制,保证数据的正确性,任何一个时刻只有一个任务在访问共享的内存区域

  1)申请物理内存区域

    函数原型:int shmget(key_t key,size_t size,int shmflg);

    功能  :开辟实际物理内存区域

    参数  :key:  来自ftok

        :size  物理内存的大小

        :shmflg    IPC_CREAT|IPC_EXCK|0664   创建并打开物理内存(内存不存在,开辟;已存在,报错)

    返回值 :成功     共享内存的标识符

         失败  -1

  2)将物理内存映射到进程的虚拟地址空间上(进程只需要操作属于自己的虚拟地址空间,本质访问实际物理内存)

    函数原型: void *shmat(int shmid,const void *shmaddr,int shmflg);

    功能  :将物理内存区域映射到进程的虚拟地址空间(将物理地址转换为虚拟地址)

    参数  :shmid  共享内存标识符

        :shmaddr  NULL   将物理内存映射进程一个合理的位置(未使用,且内存足够大区域)

        :shmflg  0  对于共享内存段,可以实现读写

    返回值  :成功  链接物理内存的虚拟地址

          失败   -1

  3)将物理内存释放

    函数原型:int shmctl(int shmid,int cmd,struct shmid_ds *buf);

    功能  :实现对共享内存的控制

    参数  :shmid  共享内存的标识符

        :cmd  制定对共享内存的操作

              IPC_STAT   从第三个参数中读取共享内存的属性信息

              IPC_SET  设置共享内存的属性信息

              IPC_RMID  删除共享内存

        :buf  描述共享内存属性的结构体

struct shmid_ds {  
struct ipc_perm shm_perm; /* Ownership and permissions */ 访问的权限
size_t shm_segsz; /* Size of segment (bytes) */ 共享内存的大小
time_t shm_atime; /* Last attach time */ 上一次被映射的时间
time_t shm_dtime; /* Last detach time */ 上一次被断开映射的时间
time_t shm_ctime; /* Last change time */ 上一次改变的时间
pid_t shm_cpid; /* PID of creator */ 创建共享内存的用户ID
pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */ 上一次执行映射和断开映射的进程ID
shmatt_t shm_nattch; /* No. of current attaches */ 被映射的次数(编号)
...
};
返回值:成功 0
失败 -1

4.信号灯

  信号灯:信号量集

  信号量的核心:PV操作

  1)创建多个信号量

    函数原型:int semget(key_t key,int nsems,int semflg);

    功能  :创建或打开多个信号量

    参数  :key 值   ftok

        :nsems   创建或打开信号量的个数

        :semflg   IPC_CREAT|IPC_EXCL|0664    创建并打开信号量(信号量存在,报错,不存在,自动创建)

        : 0664     打开信号量集的标识符

    返回值: 成功:信号量集的标识符,失败:-1

  2)申请,释放信号量

    函数原型:int semop(int semid,struct sembuf *sops,unsigned nsops);

    功能  :实现对信号量集的操作

    参数  :semid 信号量集的标识符

        :  sops:

struct sembuf{
  unsigned short sem_num; /* semaphore number */ 信号量的编号
  short sem_op; /* semaphore operation */
      1   释放信号量 值+1
      0 等待信号量的值变为0
      -1 申请信号量 值-1
short sem_flg; /* operation flags */ 默认为0
}
nsops 本次函数操作的信号量的个数
返回值:成功 0
失败 -1

   3)信号量集的控制

函数原型:int semctl(int semid, int semnum, int cmd, ...);
功能:实现对信号量集中某一个信号量的控制
参数:semid 信号量集的标识符
semnum 信号量集信号量的编号
cmd 指定对信号量的控制
IPC_STAT 获取信号量的属性信息
IPC_SET 设置信号量的属性信息
IPC_RMID 删除信号量
SETVAL 设置第semnum个信号量的初始值
GETVAL 获取第semnum个信号量的值
返回值:成功 0
GETVAL 当前信号量的值

失败 -1
  ... 附件参数
 union semun {
    int val; /* Value for SETVAL */
    struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
    unsigned short *array; /* Array for GETALL, SETALL */
    struct seminfo *__buf; /* Buffer for IPC_INFO
    (Linux-specific) */
  };
信号量的属性
truct semid_ds {
  struct ipc_perm sem_perm; /* Ownership and permissions */ 访问的权限
  time_t sem_otime; /* Last semop time */ 上一次PV操作的时间
  time_t sem_ctime; /* Last change time */ 上一次改变的时间
  unsigned short sem_nsems; /* No. of semaphores in set */ 信号量集合中信号量个数
};

linux io 学习笔记(03)---共享内存,信号灯,消息队列的更多相关文章

  1. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  2. php中对共享内存,消息队列的操作

    http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...

  3. 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列

    信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...

  4. Linux学习笔记27——共享内存

    一 共享内存 共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中.其他进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址.如果某个进程向 ...

  5. linux C学习笔记02--共享内存(进程同步)

    system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ...

  6. linux后台查看共享内存和消息队列的命令

    ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...

  7. Linux 进程间通信(管道、共享内存、消息队列、信号量)

           进程通信 : 不同进程之间传播或交换信息    为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...

  8. linux io 学习笔记(02)---条件变量,管道,信号

    条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t  定 ...

  9. linux io 学习笔记(01)---锁,信号量

    1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源. 2.sudo  dmesg -c 消除dmesg缓冲 3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性 ...

随机推荐

  1. jsonp跨域请求响应结果处理函数(python)

    接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...

  2. 【[HEOI2016/TJOI2016]游戏】

    据说是网络流棋盘模型了 我们把每一个连续子段都看成一个点,我们先把所有的行上的连续子段找出来给他们编上号,所有列上的连续子段找出来也编上号 现在每个格子都有两个编号了,\(a[i][j]\)表示行所对 ...

  3. 什么是React中的组件

    组件就是页面上的一部分.如图,左边是一个网页.右边是对应的一个组件图.我们可以把一个大的网页拆分成很多小的部分.比如标题部分,对应一个组件,就是标题组件.搜索部分,对应的组件就是搜索组件.而这个搜索组 ...

  4. position中需要注意的地方

    relative是相对元素本身位置进行移位,但不会改变本身位置的大小 本身的位置 移位后,可以看到,p5的位置还是在那,并不会自动往上走,也就是p2的位置原来所占据的位置不变的.不会因为偏移而改变布局 ...

  5. 【洛谷P1978】 集合

    集合 题目链接 显然,我们是要把数据先排序的, 然后从大到小枚举每个数,看是否能选上, 能选就选,不能拉倒 若能,二分查找a[i]/k,若查找成功,ans++ 将a[i]/k标记为不能选择 最后输出答 ...

  6. Android学习笔记_26_多媒体之拍照

    一.配置文件: 需要引入摄像头权限,sdcard读写权限. <?xml version="1.0" encoding="utf-8"?> <m ...

  7. Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616779 本文出自方志朋的博客 简介 采用openresty 开发出的api网关有很多 ...

  8. 简析--Java中常见的一些关键字的解析

    在Java开发中我们经常会用到一些关键字,关键字的定义很有意思"Java事先定义好的,具有特殊含义的单词",那么我们怎么来用好关键字呢?下面我们对一些常见的关键字进行分析和比较; ...

  9. Flask—06-理解掌握flask数据模型(02)

    数据模型 模型关系 一对多(使用最多) 一:学生(Student) 需要添加反向引用 多:文章(Article) 需要添加外键关联 一对一 一:学生(Student),主表 需要添加反向引用,在一对多 ...

  10. SQL3120W 不能将xx的字段值转换成 INTEGER值

    一次用DB2 Load/Import导入数据时,报错,提示SQL3120W 不能将xx的字段值转换成 INTEGER值,但目标列不可为空.未装入该行. 目标表: CREATE TABLE TEST( ...