编制一个简单共享内存读写 c语言
时间: 2024-10-14 13:16:29 浏览: 17
在C语言中,我们可以使用`#include <sys/mman.h>` 和 `#include <fcntl.h>`头文件来编写一个简单的共享内存程序。下面是一个基本的例子,展示了如何创建、映射和读写的共享内存区域:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#define SHM_KEY 12345 // 自定义的共享内存标识符
#define SHM_SIZE 1024 // 共享内存大小
int main(int argc, char *argv[]) {
int shmid; // 存储共享内存ID
void *shmptr; // 地址指针
key_t shm_key = ftok(".", SHM_KEY); // 创建键值
if (argc != 2) {
fprintf(stderr, "Usage: %s <action> [value]\n", argv[0]);
return -1;
}
if ((shmid = shmget(shm_key, SHM_SIZE, IPC_CREAT | 0666)) == -1) {
perror("shmget");
return -1;
}
if ((shmptr = shmat(shmid, NULL, 0)) == (void *)-1) { // 获取共享内存地址
perror("shmat");
shmctl(shmid, IPC_RMID, NULL); // 删除无效的共享内存
return -1;
}
if (strcmp(argv[1], "read")) { // 写入操作
char value[10] = "Hello World";
memcpy(shmptr, value, strlen(value) + 1);
} else { // 读取操作
char read_value[10];
strncpy(read_value, shmptr, SHM_SIZE);
printf("Read from shared memory: %s\n", read_value);
}
shmdt(shmptr); // 从内存中解除关联
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
return 0;
}
```
在这个例子中,首先创建了一个共享内存段,并设置了一个键值作为标识。然后,根据命令行参数("read" 或 "write")进行相应的读写操作。如果是写入,我们将字符串写入共享内存;如果是读取,我们复制共享内存的内容到用户提供的缓冲区。
注意:这个示例假设共享内存是在单台机器上运行,如果你有分布式环境需求,你需要使用更复杂的解决方案,比如网络文件系统(NFS)或其他专门的分布式存储服务。
阅读全文