(2)编写c程序实现共享内存操作 程序1向共享内存写入键盘输入的数据; 程序2从共享内存读取程序1的数据并打印; 两个程序都使用while(1)循环执行,直到强制退出。
时间: 2024-05-10 15:16:04 浏览: 8
下面是一个简单的实现:
程序1(写入数据):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 1); // 使用当前目录和一个整数值生成共享内存的key
int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 创建共享内存
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
char *shmaddr = shmat(shmid, NULL, 0); // 映射共享内存
if (shmaddr == (char *)-1) {
perror("shmat");
exit(EXIT_FAILURE);
}
while (1) {
printf("Enter some text: ");
fgets(shmaddr, SHM_SIZE, stdin); // 从键盘读入数据到共享内存
}
shmdt(shmaddr); // 解除映射
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
return 0;
}
```
程序2(读取数据):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 1); // 使用当前目录和一个整数值生成共享内存的key
int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 创建共享内存
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
char *shmaddr = shmat(shmid, NULL, 0); // 映射共享内存
if (shmaddr == (char *)-1) {
perror("shmat");
exit(EXIT_FAILURE);
}
while (1) {
printf("Received: %s", shmaddr); // 从共享内存读取数据并打印
}
shmdt(shmaddr); // 解除映射
return 0;
}
```
需要注意的是,程序1和程序2都需要使用同样的key来访问共享内存,否则无法正常通信。此外,在使用完共享内存后,需要及时解除映射并删除共享内存,以避免资源泄露。