两个程序如何通过共享内存获取数据
时间: 2024-05-05 21:21:51 浏览: 7
共享内存是一种在不同进程间共享数据的方式。在Linux中,可以使用shmget、shmat、shmdt、shmctl等系统调用来操作共享内存。以下是一个示例代码,展示了如何在两个进程中使用共享内存进行数据交换:
进程A:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 'a'); // 获取共享内存的键值
int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // 创建共享内存
char *shmaddr = shmat(shmid, NULL, 0); // 映射共享内存到进程地址空间
while (1) {
sprintf(shmaddr, "Hello, process B!\n"); // 向共享内存写入数据
sleep(1);
}
shmdt(shmaddr); // 解除共享内存映射
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
return 0;
}
```
进程B:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key = ftok(".", 'a'); // 获取共享内存的键值
int shmid = shmget(key, SHM_SIZE, 0666); // 获取共享内存
char *shmaddr = shmat(shmid, NULL, 0); // 映射共享内存到进程地址空间
while (1) {
printf("%s", shmaddr); // 从共享内存读取数据并输出
sleep(1);
}
shmdt(shmaddr); // 解除共享内存映射
return 0;
}
```
在上述示例中,进程A和进程B通过共享内存进行数据交换。进程A向共享内存写入数据,进程B从共享内存中读取数据并输出。注意,共享内存的大小需要在创建时指定,且同一个进程只能映射一次同一个共享内存。在使用完共享内存后,需要调用shmdt解除共享内存映射,并调用shmctl删除共享内存。