在内核中创建一个共享内存,将该共享内存前四个字节作为 int 看待 (shmat 返回值使用 int*),初始为0 利用父子进程并发执行!!! 对该共享内存前四字节 各自增 100w 次
时间: 2024-09-13 11:10:24 浏览: 39
一个简单的示例,演示了如何在 C 语言中使用共享内存
在Linux内核中,通过系统调用shmat可以创建并映射到进程地址空间的共享内存区域。首先,你需要在父进程中创建共享内存,并将其初始化为0:
```c
#include <sys/shm.h>
#include <sys/ipc.h>
int shm_key = ftok("/path/to/shared_memory_file", 's'); // 生成键值
int shmid;
int *shared_memory;
shmid = shmget(shm_key, sizeof(int), SHM_RDONLY | IPC_CREAT); // 创建或获取共享内存ID,只读权限
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
shared_memory = (int*)shmat(shmid, NULL, 0); // 映射到地址空间,如果NULL则随机分配位置
if (shared_memory == (int*)(-1)) { // 如果失败,返回-1
perror("shmat failed");
exit(1);
}
*shared_memory = 0; // 初始化为0
// 父进程在此处完成其他任务后,需要调用shmdt来解除关联
```
接下来,在子进程中,你可以同样创建共享内存并执行加1操作:
```c
pid_t child_pid = fork(); // 创建子进程
if (child_pid == 0) { // 子进程
shared_memory = (int*)shmat(shmid, NULL, 0);
for (size_t i = 0; i < 1000000; i++) {
(*shared_memory)++;
}
_exit(EXIT_SUCCESS); // 简化退出,子进程不会执行父进程的部分
} else if (child_pid > 0) { // 父进程
wait(NULL); // 等待子进程结束
}
// 在父进程中,shmdt(shmid) 来移除映射,然后关闭shmid
shmdt(shared_memory);
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
```
注意,上述代码示例假设你有适当的权限访问共享文件以及共享内存的操作。此外,实际应用中可能还需要考虑错误处理和同步机制,比如使用信号量或互斥锁来避免数据竞争。
阅读全文