Linux消息队列与信号量

Linux消息队列与信号量

一、消息队列

概念:消息队列是由内核负责维护管理的链式数据队列,不是根据先后顺序出队,而是根据消息类型进行收发数据

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:数据的字节数,不包含消息类型,例如上面数据变成结构体时,传参为:sizeofstruct- sizeoflong)
    msgflg:
        阻塞发送一般给0
        IPC_NOWAIT 当消息队列满,不等待立即返回

    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,正在休眠的进程就会被唤醒

int semget(key_t key, int nsems, int semflg);
功能:创建\获取信号量
key:IPC键值
nsems:信号量的数量 一般写1
semflg:IPC_CREAT  信号量已存在则获取,否则创建
        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:结构体个数,第二个参数可以是结构体数组                
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值