应用Linux共享内存机制, 实现两个进程间相互传递一个学生的记录
时间: 2024-06-11 16:09:01 浏览: 91
精选_毕业设计_Linux进程管理-利用Linux的共享内存通信机制实现两个进程间的通信_完整源码
5星 · 资源好评率100%
以下是一个基本的示例代码,其中包含两个进程间共享学生记录的实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHMSZ 1024
struct student {
char name[20];
int age;
float gpa;
};
int main() {
int shmid;
struct student *stud;
key_t key = 1234;
// 创建共享内存段
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
// 连接共享内存段
if ((stud = shmat(shmid, NULL, 0)) == (struct student *) -1) {
perror("shmat");
exit(1);
}
// 写入学生记录到共享内存段
strcpy(stud->name, "Tom");
stud->age = 20;
stud->gpa = 3.5;
// 创建子进程
pid_t pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子进程读取学生记录
printf("Child process:\n");
printf("Name: %s\n", stud->name);
printf("Age: %d\n", stud->age);
printf("GPA: %.2f\n", stud->gpa);
// 修改学生记录
strcpy(stud->name, "Jerry");
stud->age = 21;
stud->gpa = 3.8;
// 解除共享内存段连接
if (shmdt(stud) == -1) {
perror("shmdt");
exit(1);
}
exit(0);
} else {
// 等待子进程结束
wait(NULL);
// 父进程读取修改后的学生记录
printf("Parent process:\n");
printf("Name: %s\n", stud->name);
printf("Age: %d\n", stud->age);
printf("GPA: %.2f\n", stud->gpa);
// 解除共享内存段连接
if (shmdt(stud) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存段
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
}
return 0;
}
```
在以上示例代码中,我们先创建了一个 key 值为 1234 的共享内存段,大小为 SHMSZ,然后连接到该共享内存段,将学生记录写入到共享内存段中。接着,创建一个子进程,在子进程中读取学生记录,并修改学生记录。等到子进程结束后,父进程再次读取修改后的学生记录,最后解除共享内存段连接,并删除该共享内存段。
通过这种方法,我们就可以实现两个进程间相互传递一个学生的记录。需要注意的是,如果多个进程同时访问同一个共享内存段,需要使用同步机制来避免竞争条件的发生。
阅读全文