@@ -418,16 +418,34 @@ int msgrcv(int msgid, void *msg_ptr, size_t msgsz,long int msgtype, int msgflg)
418418
419419
420420---
421- #### 消息队列控制
421+ #### 消息队列控制:查询队列状态、修改权限、删除队列等
422422```
423423int msgctl(int msqid, int cmd, struct msqid_ds *buf);
424424```
425425- 消息队列的属性保存在系统维护的数据结构msqid_ds中,可以通过函数msgctl获取或设置消息队列的属性。
426426- msgctl:对msgqid标识的消息队列执行cmd操作,3种cmd操作:
427427 - IPC_STAT:获取消息队列对应的msqid_ds数据结构(保存到buf)
428- - IPC_SET:设置消息队列的属性, 存储在buf中,包括:msg_perm.uid、 msg_perm.gid、msg_perm.mode、msg_qbytes
428+ - IPC_SET:修改消息队列的属性( 存储在buf中) ,包括:msg_perm.uid、 msg_perm.gid、msg_perm.mode、msg_qbytes
429429 - IPC_RMID:从内核中删除msgqid标识的消息队列
430430- buf是指向msgid_ds结构的指针,指向消息队列模式和访问权限
431+
432+
433+ ---
434+ #### 消息队列
435+ ```
436+ struct msqid_ds {
437+ struct ipc_perm msg_perm; // 权限信息
438+ time_t msg_stime; // 最后发送消息的时间(单位:秒,从 1970-01-01 起)
439+ time_t msg_rtime; // 最后接收消息的时间
440+ time_t msg_ctime; // 最后修改队列的时间(如 IPC_SET、IPC_RMID)
441+ unsigned long msg_cbytes;// 当前队列中的字节数
442+ msgqnum_t msg_qnum; // 当前队列中的消息数量
443+ msglen_t msg_qbytes; // 队列允许的最大字节数
444+ pid_t msg_lspid; // 最后发送消息的进程 PID
445+ pid_t msg_lrpid; // 最后接收消息的进程 PID
446+ };
447+ ```
448+
431449---
432450#### 消息队列[ 示例程序] ( https://gitee.com/chyyuu/os-usrapp-lab/blob/main/c/ipc/message-queues/ex1.c )
433451```
@@ -477,7 +495,7 @@ Child: read msg:test
477495- shmget( key, size, flags) //创建共享段
478496- shmat( shmid, * shmaddr, flags) //把共享段映射到进程地址空间
479497- shmdt( * shmaddr)//取消共享段到进程地址空间的映射
480- - shmctl(shmid, cmd, shmid_ds * buf) //共享段控制
498+ - shmctl(shmid, cmd, shmid_ds * buf) //控制共享段
481499
482500注:需要信号量等同步机制协调共享内存的访问冲突
483501
0 commit comments