linux 1、有P1,P2,P3三个进程,P1和P2负责从键盘接收字符串,均发送给P3,P3接收到字符串,根据发送方分别显示”P3 received *** from P1(或P2)" ;用共享存储的方式实现
时间: 2024-02-06 21:09:48 浏览: 136
可以使用共享内存来实现进程间的通信。具体实现步骤如下:
1. 创建共享内存段,并设置权限和大小。
2. 将共享内存段映射到各个进程的虚拟地址空间中。
3. 在进程P1和P2中读取键盘输入,并将字符串写入共享内存段中。
4. 进程P3从共享内存段中读取字符串,并根据发送方显示相应的信息。
下面是一个简单的实现示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
#define KEY 1234
int main()
{
int shmid;
char *shmaddr;
char buffer[SHM_SIZE];
// 创建共享内存段
shmid = shmget(KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget");
exit(1);
}
// 将共享内存段映射到进程的虚拟地址空间中
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *) -1) {
perror("shmat");
exit(1);
}
// 循环读取键盘输入并写入共享内存段
while (1) {
printf("Enter a string: ");
fgets(buffer, SHM_SIZE, stdin);
strcpy(shmaddr, buffer);
}
// 从共享内存段中读取字符串并显示
printf("Received: %s", shmaddr);
// 分离共享内存段
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存段
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
return 0;
}
```
在进程P1和P2中,可以使用类似的方法读取键盘输入并写入共享内存段:
```
// 循环读取键盘输入并写入共享内存段
while (1) {
printf("Enter a string: ");
fgets(buffer, SHM_SIZE, stdin);
strcpy(shmaddr, buffer);
}
```
在进程P3中,可以使用类似的方法从共享内存段中读取字符串并根据发送方显示相应的信息:
```
// 从共享内存段中读取字符串并显示
while (1) {
if (strcmp(shmaddr, "") != 0) {
if (strncmp(shmaddr, "P1", 2) == 0) {
printf("P3 received %s from P1\n", shmaddr + 3);
} else if (strncmp(shmaddr, "P2", 2) == 0) {
printf("P3 received %s from P2\n", shmaddr + 3);
}
strcpy(shmaddr, "");
}
}
```
需要注意的是,由于多个进程都可以访问共享内存段,因此需要使用同步机制来保证数据的正确性。可以使用信号量或者互斥锁等机制来实现进程间的同步。
阅读全文