Linux中消息队列(msgget、msgsnd、msgrcv、msgctl函数使用、P、V操作的案例代码介绍)

本文详细介绍了消息队列的概念、使用步骤,以及信号量和信号灯(包括Posix有名信号灯、SystemV信号灯)的原理、操作方法和案例。通过这些关键概念,探讨了在IT技术中资源管理和进程通信的实践应用。
摘要由CSDN通过智能技术生成

消息队列

概念

  • 消息队列是System V IPC对象的一种
  • 消息队列有消息队列ID来唯一标识
  • 消息队列就是一个消息列表。用户可以在消息队列中添加消息、读取信息等
  • 消息队列可以按照类型来发送/结束消息

消息队列使用步骤

  • 打开/创建消息队列 msgget
  • 向消息队列发送信息 msgsnd
  • 从消息队列接收消息 msgrcv
  • 控制消息队列 msgctl
  • 打开创建消息队列函数介绍
    在这里插入图片描述
  • 代码实现如下:
    在这里插入图片描述
  • 发送消息函数介绍
    在这里插入图片描述
  • 消息格式
    在这里插入图片描述
  • 发送函数的使用
    在这里插入图片描述
    在这里插入图片描述* 执行后如何查看已经创建好了:
    在这里插入图片描述
  • 执行ipcs后如下:
    在这里插入图片描述
  • 接收消息:
    在这里插入图片描述
    在这里插入图片描述
  • 接受消息的主要代码如下:
    在这里插入图片描述
  • 执行如下:
    在这里插入图片描述
  • 消息队列的控制
    在这里插入图片描述

信号灯概念和有名信号灯

信号量/灯

  • 信号量代表某一类资源,其值表示系统中该资源的数量
  • 信号量是一个受保护的变量,只能通过三种操作来访问
    • 初始化
    • P操作(申请资源):消费者
    • V操作(释放资源):生产者
  • 信号量-P/V操作伪代码实现:
    在这里插入图片描述
  • 三种信号灯
    • Posix有名信号灯
    • Posix无名信号灯(linux只支持线程同步)
    • System V信号灯
  • Posix有名信号灯和无名信号灯使用:
    在这里插入图片描述
  • 有名信号灯打开:
    sem_t *sem_open(const char *name,int oflag);
    sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value);
    参数:
    name:name是给信号灯起的名字
    oflag:打开方式,常用O_CREAT
    mode:文件权限。常用0666
    value:信号量值。二元信号灯值为1,普通表示资源数目
    信号灯文件位置:/dev/shm
    有名信号灯关闭
    int sem_close(sem_t sem);
    有名信号灯的删除
    int sem_unlink(const char
    name);
  • 信号灯P、V操作
    在这里插入图片描述
  • 读和写信号量使用案例代码如下:
    在这里插入图片描述
  • 写信号量代码:
    在这里插入图片描述
  • 读信号量代码:
    在这里插入图片描述
  • 执行如下:
    在这里插入图片描述
    注:上述代码只能运行一次,运行第二次就不行了,改进如下:
  • 读信号量添加如下代码:
    在这里插入图片描述
    注:写信号量同上
  • 无名信号灯代码如下:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
  • System V信号灯使用:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 案例代码如下:
    在这里插入图片描述
    在这里插入图片描述
    P、V操作函数如下:
    在这里插入图片描述
    然后父子进程读信号和写信号操作如下:
    在这里插入图片描述
  • 执行如下:
    在这里插入图片描述
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
msggetmsgsndmsgrcvmsgctlLinux系统用来实现进程间通信的一组函数,主要用于消息队列的创建、发送、接收和控制。 1. msgget函数:创建或打开一个消息队列 函数原型:int msgget(key_t key, int msgflg); 参数说明: - key:消息队列的键值,不同的消息队列应该有不同的键值。 - msgflg:标志参数,用于指定打开或创建消息队列的方式,可以是IPC_CREAT,IPC_EXCL等。 返回值: - 成功:返回消息队列的标识符(消息队列ID) - 失败:返回-1 2. msgsnd函数:向消息队列发送一条消息 函数原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数说明: - msqid:消息队列的标识符(消息队列ID) - msgp:指向消息的指针,该消息的类型是一个结构体,包含消息类型和消息内容。 - msgsz:消息的长度,单位为字节数。 - msgflg:标志参数,用于指定消息队列是否满时的处理方式,可以是IPC_NOWAIT等。 返回值: - 成功:返回0 - 失败:返回-1 3. msgrcv函数:从消息队列接收一条消息 函数原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 参数说明: - msqid:消息队列的标识符(消息队列ID) - msgp:指向接收到的消息的指针,该消息的类型是一个结构体,包含消息类型和消息内容。 - msgsz:消息的最大长度,单位为字节数。 - msgtyp:消息的类型,指定需要接收的消息类型。 - msgflg:标志参数,用于指定消息队列是否为空时的处理方式,可以是IPC_NOWAIT等。 返回值: - 成功:返回接收到的消息的长度(字节数) - 失败:返回-1 4. msgctl函数:控制消息队列的状态 函数原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf); 参数说明: - msqid:消息队列的标识符(消息队列ID) - cmd:控制命令,可以是IPC_STAT、IPC_SET、IPC_RMID等。 - buf:指向消息队列状态结构体的指针,用于传递或返回消息队列的状态信息。 返回值: - 成功:返回0 - 失败:返回-1 以上是msggetmsgsndmsgrcvmsgctl的简介和常用用法,通过这些函数可以实现在进程间传递消息,这在多进程编程非常有用。需要注意的是,消息队列是有容量限制的,如果消息队列已满,则发送者会被阻塞,直到有足够的空间。同样,如果消息队列为空,则接收者会被阻塞,直到有新的消息到达。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值