Linux 有P1,P2,P3三个进程,P1和P2负责从键盘接收字符串,均发送给P3,P3接收字符串,根据消息的发送方分别显示“received from p1""received from p2”,分别用消息队列和共享存储的方式实现
时间: 2023-11-22 22:55:54 浏览: 103
下面是使用消息队列的实现方法:
1. 创建消息队列
P1和P2进程创建一个消息队列,并将队列ID发送给P3进程。
```c
key_t key = ftok(".", 'a'); // 创建唯一的key
int msgqid = msgget(key, IPC_CREAT|0666); // 创建消息队列
```
2. P1和P2进程从键盘接收字符串并发送给P3进程
```c
struct message {
long mtype;
char mtext[1024];
};
struct message msg;
msg.mtype = 1;
// 从键盘读入字符串
fgets(msg.mtext, 1024, stdin);
// 发送消息到消息队列
msgsnd(msgqid, &msg, sizeof(msg.mtext), 0);
```
3. P3进程接收消息并根据发送方显示消息
```c
// 接收消息
struct message msg;
msgrcv(msgqid, &msg, sizeof(msg.mtext), 0, 0);
// 显示消息
if (msg.mtype == 1) {
printf("received from p1: %s\n", msg.mtext);
} else if (msg.mtype == 2) {
printf("received from p2: %s\n", msg.mtext);
}
```
下面是使用共享内存的实现方法:
1. 创建共享内存
P1和P2进程创建一块共享内存,并将共享内存ID发送给P3进程。
```c
key_t key = ftok(".", 'a'); // 创建唯一的key
int shmid = shmget(key, 1024, IPC_CREAT|0666); // 创建共享内存
```
2. P1和P2进程从键盘接收字符串并写入共享内存
```c
char *shared_mem = (char *) shmat(shmid, NULL, 0); // 将共享内存映射到进程地址空间
// 从键盘读入字符串
fgets(shared_mem, 1024, stdin);
// 解除共享内存映射
shmdt(shared_mem);
```
3. P3进程读取共享内存并根据发送方显示消息
```c
char *shared_mem = (char *) shmat(shmid, NULL, 0); // 将共享内存映射到进程地址空间
if (strcmp(shared_mem, "") != 0) {
// 显示消息
if (strcmp(shared_mem, "p1") == 0) {
printf("received from p1: %s\n", shared_mem + 2);
} else if (strcmp(shared_mem, "p2") == 0) {
printf("received from p2: %s\n", shared_mem + 2);
}
// 清空共享内存
memset(shared_mem, 0, 1024);
}
// 解除共享内存映射
shmdt(shared_mem);
```
在这个实现中,P1和P2进程在共享内存中写入的字符串需要加上发送方的标识,例如:p1hello或p2world。P3进程读取共享内存时,先判断共享内存中是否有数据,然后根据标识判断消息是从P1还是P2发送的,最后显示消息并清空共享内存。
阅读全文