快速掌握Linux(8)(消息队列)(共享内存)
2026/9/24 4:55:41 网站建设 项目流程

4)消息队列

system V : IPC对象

消息队列:

1.将进程间通信的数据封装成消息体发送;

2.增加消息类型,可以根据消息的类型设置数据的优先级。

1.获取IPC的key值:ftok();

2.创建消息队列 :msgget();

3.发送消息队列消息: msgsnd();

4.接收消息队列消息 :msgrcv();

5.删除消息队列 : msgctl();

(1)key_t ftok(const char *pathname, int proj_id);

功能:产生一个IPC对象key值

参数:

pathname:路径名

proj_id:项目id

返回值:

成功:key值

失败:-1

(2)int msgget(key_t key, int msgflg);

功能:根据key值创建一个消息队列

参数:

key: IPC key值

msgflg:IPC_CREAT|0664

返回值:

成功:消息队列ID

失败:-1

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

功能:发送消息队列的消息

参数:

msqid:消息队列ID

msgp:要发送的消息体

struct msgbuf {

long mtype; /* message type, must be > 0 */ 消息类型

char mtext[1]; /* message data */ 消息正文

};

msgsz:消息正文大小

msgflg:标志位:0:默认方式发送

返回值:

成功:0

失败:-1

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

功能:操作IPC对象对应的消息队列

参数:

msqid:消息队列的id

cmd:操作方法:

IPC_STAT:获取状态操作

IPC_SET: 设置

IPC_RMID:删除操作

buf

IPC_RMID :buff-》NULL

返回值:

成功:0

失败:-1

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

功能:从消息队列中接收消息

参数:

msqid:消息队列ID

msgp:要接受的消息的存储位置

msgsz:消息正文的大小

msgtyp:消息类型

msgflg:标志位:0:默认方式

返回值:

成功:返回实际消息正文的大小

失败:-1

(6)IPC对象命令

ipcs -a

查看系统中的IPC对象

ipcrm -q msgid

ipcrm -Q msgkey

删除消息队列

5)共享内存

共享内存:进程间效率最高的通信方式

利用内存映射技术,避免了数据的反复拷贝

int shmget(key_t key, size_t size, int shmflg);

功能:创建共享内存并获得共享内存的id

参数:

keyIPC对象key

size:共享内存的大小(PAGE_SIZE4096字节)整数倍)

shmflgIPC_CREAT | 0664

返回值:

成功:共享内存的ID

失败:-1

void *shmat(int shmid, const void *shmaddr, int shmflg);

功能:建立共享内存和用户空间的内存映射

参数:

shmid:共享内存id

shmaddr:映射的用户空间首地址

NULL :由操作系统选择用户空间并以返回值的方式返回空间首地址

shmflg

SHM_RDONLY :只读

!SHM_RDONLY :读写

返回值:

成功:映射的用户空间首地址

失败:(void *)-1

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

功能:操作共享内存

参数:

shmid:共享内存id

cmd:操作指令

IPC_RMID删除操作

bufNULL

返回值:

成功:0

失败:-1

ipcs -a

查看IPC对象。

ipcrm -m shmid

ipcrm -M shmkey

删除共享内存

6)信号量集

信号量集(信号量数组):进程间同步

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询