消息队列、信号量

消息队列:
基本特点:是由内核负责维护管理的链式数据队列,不是根据先后
顺序出队,而是根据消息类型进行收发数据
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

   int msgget(key_t key, int msgflg);
    功能:创建\获取消息队列
    key:IPC键值
    msgflg:
        IPC_CREAT  消息队列已存在则获取,否则创建
        IPC_EXCL    消息队列已存在则返回错误
        注意:如果创建需要提供权限 
    返回值:IPC标识符,失败-1

        int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
        功能:向消息队列发送消息包
        msqid:IPC标识符
        msgp:要发送的消息包的首地址
            struct msgbuf {
           long mtype;       //消息类型
           char mtext[n];    //数据
       };
       msgsz:数据的字节数,不包含消息类型
       msgflg: 
            阻塞发送一般给0
            IPC_NOWAIT 当消息队列满,不等待立即返回
        返回值:成功0,失败-1


        ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                  int msgflg);
        功能:从消息队列中接收对应消息包的数据
        msqid:IPC标识符
        msgp:存储消息包的内存首地址
        msgsz:存储数据的内存字节数(尽量大些)
        msgtyp:消息类型(按照类型获取,不按照顺序)
            >0  读取消息类型=msgtyp的消息
            =0  读取消息队列中的第一条消息
            <0  读取消息类型小于abs(msgtyp)的消息,如果有多个则读取值最小的
        msgflg 
            IPC_NOWAIT 消息队列都不符合时不阻塞,立即返回
            MSG_EXCEPT  如果msgtyp>0,则读取第一条不等于msgtyp的消息
            MSG_NOERROR 如果不包含此标志,如果实际发送过来的数据字节数
            >接收的字节数,则返回失败,如果包含此标志,那么就只读取接收的
            字节数,一定会成功
        返回值:成功读取到数据的字节数


    int msgctl(int msqid, int cmd, struct msqid_ds *buf);
    功能:获取\修改消息队列的属性、删除属性
    msqid:IPC标识符 
   cmd:
        IPC_STAT    获取消息队列属性    buf输出型参数
        IPC_SET     设置消息队列属性    buf输入型参数
        IPC_RMID    删除消息队列        NULL 
   buf

   编程模型:   
        进程A                   进程B
        创建消息队列            获取消息队列 
        发送消息                获取消息 
        获取消息                发送消息 
        删除消息队列   

信号量:
基本特点:由内核管理的一个“全局变量”,用于记录共享资源的数量,
限制进程对共享资源的访问使用
信号量是一种数据操作锁,本身是不具备数据交互功能,而是通过控制其他
的通信资源从而配合实现进程间通信
1、如果信号量的值大于0,说明可以使用资源,使用时需要将信号量-1,
然后再使用
2、如果信号量的值等于0,说明没有资源可使用,此时进程进入休眠,直到
信号量的值大于0,进程会被唤醒,执行步骤1
3、当资源使用完毕,把信号量的值+1,正在休眠的进程就会被唤醒

      #include <sys/types.h>
   #include <sys/ipc.h>
   #include <sys/sem.h>

   int semget(key_t key, int nsems, int semflg);
    功能:创建\获取信号量
    key:IPC键值
    nsems:信号量的数量 一般写1
    semflg:
        IPC_CREATE  信号量已存在则获取,否则创建
        IPC_EXCL    信号量已存在则返回错误
        注意:如果创建需要提供权限 
    返回值:IPC标识符,失败-1   
    
    int semctl(int semid, int semnum, int cmd, ...);
    功能:删除、控制信号量
    semid:IPC标识符
    semnum:要操作的第几个信号量,从0开始,下标
    cmd:
        IPC_STAT    获取信号量属性    buf输出型参数
        IPC_SET     设置信号量属性    buf输入型参数
        IPC_RMID    删除信号量        NULL
        SETVAL      设置某个信号量的值
        SETALL      设置所有信号量的值
        GETVAL      获取某个信号量的值
        GETALL      获取所有信号量的值
        GETNCNT     获取等待拿资源的进程数量

    int semop(int semid, struct sembuf *sops, size_t nsops);
    功能:对信号量进行加减操作
    semid:IPC标识符 
    sembuf{
        unsigned short sem_num;  //信号量的下标
       short          sem_op;   //
        1   信号量+1
        -1  信号量-1 如果不能减,则默认阻塞
       short          sem_flg;  //
                    IPC_NOWAIT  不阻塞
                    SEM_UNDO    如果进程终止没有手动还资源,系统
                    会自动还
    }
    nsops:表示sops指向多少个结构体数量     默认为1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值