@@ -418,16 +418,34 @@ int msgrcv(int msgid, void *msg_ptr, size_t msgsz,long int msgtype, int msgflg)
418
418
419
419
420
420
---
421
- #### 消息队列控制
421
+ #### 消息队列控制:查询队列状态、修改权限、删除队列等
422
422
```
423
423
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
424
424
```
425
425
- 消息队列的属性保存在系统维护的数据结构msqid_ds中,可以通过函数msgctl获取或设置消息队列的属性。
426
426
- msgctl:对msgqid标识的消息队列执行cmd操作,3种cmd操作:
427
427
- 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
429
429
- IPC_RMID:从内核中删除msgqid标识的消息队列
430
430
- 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
+
431
449
---
432
450
#### 消息队列[ 示例程序] ( https://gitee.com/chyyuu/os-usrapp-lab/blob/main/c/ipc/message-queues/ex1.c )
433
451
```
@@ -477,7 +495,7 @@ Child: read msg:test
477
495
- shmget( key, size, flags) //创建共享段
478
496
- shmat( shmid, * shmaddr, flags) //把共享段映射到进程地址空间
479
497
- shmdt( * shmaddr)//取消共享段到进程地址空间的映射
480
- - shmctl(shmid, cmd, shmid_ds * buf) //共享段控制
498
+ - shmctl(shmid, cmd, shmid_ds * buf) //控制共享段
481
499
482
500
注:需要信号量等同步机制协调共享内存的访问冲突
483
501
0 commit comments