System V 消息队列

消息队列

创建消息队列

#include <sys/types.h>
#include <sys/msg.h>

int msgget( key_t key, int msgflg )

成功返回消息队列的标识符,它是消息队列的句柄。失败返回-1和设置error

参数 key 是一个键,用于生成唯一的标识符。可由 IPC_PRIVATE或 ftok() 生成。

参数 msgflg 是权限位和下面这些位组成:

  • IPC_CREAT:没有于指定 key 对应的消息队列,则新建一个
  • IPC_EXCL:同时设置了 IPC_CREAT 并且 key 已经存在,那么调用失败返回EEXIST
  • 向消息队列写入信息要有写权限 S_IWUSR

对 IPC 对象来说,只有读和写权限有意义,执行权限是没有意义的。

发送消息

#include <sys/types.h>
#include <sys/msg.h>

int msgsnd( int msqid, const void *msgp, size_t msgsz, int msgflg )

成功返回0, 失败返回-1和设置error

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

参数 msgp 是这样一个结构体:

struct mymsg
{
	long mtype;
	char mtext[]; /*需要发送的消息*/
}

参数 msgsz 是结构体成员 mtext 的字节数。

参数 msgflg 是一组位掩码:

  • IPC_NOWAIT:执行非阻塞的发送操作
  • 只定义了一个

接收消息

#include <sys/types.h>
#include <sys/msg.h>

ssize_t msgrcv( int msqid, void *msgp, size_t maxmsgsz, long msgtyp, int msgflg );

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

参数 msgp 是结构体

参数 maxmsgsz 是 msgp 结构体中的 mtext 成员的最大可用空间

参数 msgtyp:

  • 等于 0 时,删除消息队列中的第一条消息并将其返回给调用进程
  • 大于 0 时,将消息队列第一条 mtype 等于 msgtyp 的消息删除并返回给调用者
  • 小于 0 时,将等待消息当成优先队列来处理,队列 mytype 最小并且其值小于或等于 msgtyp 的绝对值的第一条消息会被删除并返回给调用者。

参数 msgflag 是位掩码:

  • IPC_NOWAIT:执行一个非阻塞接收
  • MSG_EXCEPT:msgtyp大于0时才起作用,将消息队列中第一条 mtype 不等于 msgtyp 的消息删除并将其返回给调用者
  • MSG_NOERROR:默认情况 mtext 大小超过了 maxmsgsz ,则会调用失败。指定了该标志则会把 mtext 截断为 maxmsgsz 字节。然后返回给调用者,被截取的数据丢失。

控制操作

#include <sys/types.h>
#include <sys/msg.h>

int msgctl( int msqid, int cmd, struct msqid_ds *buf );

成功返回0, 失败返回-1和设置error

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

参数 cmd 是如下操作:

  • IPC_RMID:立即删除消息队列,这个操作忽略第三个参数
  • IPC_STAT:将 msqid_ds 的副本放入 buf
  • IPC_SET:用 buf 更新 msqid_ds中被选中的字段

示例代码

发送数据

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>

#define BUFFER_SIZE 11

struct message
{
    long msg_type;
    char msg_text[BUFFER_SIZE];
};


int main( void )
{
    struct message msg;
    msg.msg_type = getpid();
    printf("msg.msg_type:%ld\n", msg.msg_type);
    strcpy(msg.msg_text, "Hello World");

    int qid = msgget( IPC_PRIVATE, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR );
    printf( "qid: %d\n", qid );
    msgsnd( qid, &msg, BUFFER_SIZE, 0 );

    sleep(30);

    msgctl( qid, IPC_RMID, NULL );
    exit( EXIT_SUCCESS );
}

接收数据

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>


#define BUFFER_SIZE 11

struct mbuf
{
    long mtype;
    char mtext[BUFFER_SIZE];
};

int main( int argc, char **argv )
{
    struct mbuf msg;

    msgrcv( atoi(argv[1]), &msg, BUFFER_SIZE, atoi(argv[2]), IPC_NOWAIT );

    printf("msg.mtype: %ld\n", msg.mtype);
    printf("msg.mtext: %s\n", msg.mtext);

    exit( EXIT_SUCCESS );
}

在这里插入图片描述

posted @   木丨易  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示