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. June 14th 2017 Week 24th Wednesday

    Love looks not with the eyes, but with the mind. 爱,不在眼里,而在心中. Staring in her eyes and you will find ...

  2. May 09th 2017 Week 19th Tuesday

    Everything you see exists together in a delicate balance. 世上所有的生命都在微妙的平衡中生存. A delicate balance? Can ...

  3. IOS 播放视频(MPMoviePlayerController、MPMoviePlayerViewController)

    ● iOS提供了叫 做MPMoviePlayerController.MPMoviePlayerViewController的两个 类,可以用来轻松播放视频 ➢ YouTobe就是用MPMoviePl ...

  4. 【甘道夫】NN HA 对于 Client 透明的实验

    之前转载过一篇[伊利丹]写的NN HA实验记录.该博客描写叙述了主备NN透明切换的过程,也就是说,当主NN挂掉后,自己主动将备NN切换为主NN了,Hadoop集群正常执行. 今天我继续做了一个实验.目 ...

  5. BestCoder Round #81 (div.2)

    HDU:5670~5764 A题: 是一个3进制计数: #include <bits/stdc++.h> using namespace std; ]; int calc(long lon ...

  6. LA 4731 蜂窝网络

    题目链接:https://vjudge.net/problem/UVALive-4731 题意: n 个 数,分成 w 组,求整个区间的数学期望的最小值: 一个区间的数学期望公式给出:一个区间的和 * ...

  7. 【[ZJOI2010]网络扩容】

    题目 第一问直接板子敲上去 第二问并不明白直接在残量网络上加边的神仙做法 非常显然我们需要让流量加\(k\),那么我们就使得网络里的总流量为\(maxf+k\),\(maxf\)是第一问求出来的最大流 ...

  8. maven学习记录二——依赖管理

    5       依赖管理 Jar包的管理 需求:整合struts2   页面上传一个客户id 跳转页面 5.1     添加依赖: 打开maven仓库的视图: 5.2     重建索引 1.  创建m ...

  9. 剑指offer——27. 二叉搜索树与双向链表(Java版)

    题目: 剑指offer的题目有挺多都挺典型的,就像这一道.不过书中的代码写的真是ugly,有很多题目LeetCode上都有,可以去LeetCode讨论区看看,经常有一些大神分享,写的代码真是高效.简洁 ...

  10. Angularjs实例5

    <!DOCTYPE html><html lang="zh-cn" ng-app="myApp"><head><met ...