Skip to content

Commit 00a6506

Browse files
Update p1-ipcoverview.md
1 parent c2b9d8d commit 00a6506

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

lec10/p1-ipcoverview.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,13 @@ key_t ftok(const char *pathname, int proj_id);
294294
- 选择性接收
295295
- 安全和隔离
296296

297+
-消息的结构
298+
```
299+
struct msgbuf {
300+
long mtype; /* 消息的类型 */
301+
char mtext[1];/* 消息正文 */
302+
};
303+
```
297304
![bg right:62% 90%](figs/signal-imp2.jpg)
298305

299306

@@ -386,7 +393,6 @@ int msgsnd(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
386393
```
387394
int msgrcv(int msgid, void *msg_ptr, size_t msgsz,long int msgtype, int msgflg);
388395
```
389-
390396
- msgid: 由msgget函数返回的消息队列标识码
391397
- msg_ptr:是指向准备接收的消息的指针
392398
- msgsz:是msg_ptr指向的消息长度
@@ -396,7 +402,6 @@ int msgrcv(int msgid, void *msg_ptr, size_t msgsz,long int msgtype, int msgflg)
396402
- msgtype<0返回队列第一条类型小于等于msgtype绝对值的消息
397403

398404

399-
400405
---
401406
#### 接收消息
402407
```
@@ -405,11 +410,13 @@ int msgrcv(int msgid, void *msg_ptr, size_t msgsz,long int msgtype, int msgflg)
405410
- msgflg:控制着队列中没有相应类型的消息可供接收时的行为
406411
- IPC_NOWAIT,队列没有可读消息不等待,返回ENOMSG错误
407412
- MSG_NOERROR,消息大小超过msgsz时被截断
408-
409413
返回值:
410414
- 成功:返回实际放到接收缓冲区里去的字符个数
411415
- 失败:则返回-1
412416

417+
消息会被第一个调用 msgrcv() 且匹配 mtype 的进程接收。若多个进程监听同一mtype,则操作系统调度随机选择一个进程(存在竞争)。
418+
419+
413420
---
414421
#### 消息队列控制
415422
```

0 commit comments

Comments
 (0)