编写一个程序 sharedmem.c,在其中建立一个子进程,让父子进程通过共享内存的方 法实现通信。其中,父进程创建一个共享内存段,然后由子进程将该共享内存附加到自己 的地址空间中,并写入该共享内存下列信息:Hi,this is child process sending message!。在等待子进程对共享内存的操作完成后,父进程将该共享内存附加到自己的地 址空间中,并读出该共享内存中的信息,与该共享内存段的基本信息(大小,建立该共享 内存的进程 ID,最后操作该共享内存段的进程 ID)一并显示出来C语言代码实现加注释
时间: 2024-02-10 16:10:37 浏览: 101
以下是实现共享内存通信的C程序 sharedmem.c,已加入注释以便理解:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSIZE 1024 // 定义共享内存大小
int main()
{
int shmid; // 共享内存标识符
key_t key; // 用于共享内存的键值
char *shmaddr; // 指向共享内存的指针
pid_t pid; // 进程ID
// 生成一个随机键值
key = ftok(".", 'a');
if (key == -1) {
perror("ftok error");
exit(EXIT_FAILURE);
}
// 创建共享内存段
shmid = shmget(key, SHMSIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork error");
exit(EXIT_FAILURE);
}
if (pid == 0) { /* 子进程 */
// 将共享内存附加到自己的地址空间中
shmaddr = (char *)shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
// 向共享内存写入数据
sprintf(shmaddr, "Hi, this is child process sending message!");
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} else { /* 父进程 */
// 等待子进程写入共享内存
sleep(3);
// 将共享内存附加到自己的地址空间中
shmaddr = (char *)shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
// 读取共享内存中的数据
printf("Message read from shared memory: %s\n", shmaddr);
// 获取共享内存的基本信息
struct shmid_ds buf; // 用于存储共享内存信息的结构体
if (shmctl(shmid, IPC_STAT, &buf) == -1) {
perror("shmctl error");
exit(EXIT_FAILURE);
}
// 输出共享内存的基本信息
printf("Size of shared memory segment: %lu bytes\n", buf.shm_segsz);
printf("Process ID of creator of segment: %d\n", buf.shm_cpid);
printf("Process ID of last operation on segment: %d\n", buf.shm_lpid);
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt error");
exit(EXIT_FAILURE);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, 0) == -1) {
perror("shmctl error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
return 0;
}
```
该程序的执行过程如下:
1. 父进程生成一个随机键值,用于共享内存的标识符。
2. 父进程创建一个共享内存段,大小为1024字节。
3. 父进程创建子进程。
4. 子进程将共享内存附加到自己的地址空间中,并向共享内存写入数据。
5. 子进程分离共享内存,退出。
6. 父进程等待子进程写入共享内存。
7. 父进程将共享内存附加到自己的地址空间中,读取共享内存中的数据,并获取共享内存的基本信息,包括大小、建立该共享内存的进程ID和最后操作该共享内存段的进程ID。
8. 父进程分离共享内存,删除共享内存,退出。
注意:在实际使用中,应该对共享内存中的数据进行保护,以避免多个进程同时读写同一块共享内存造成的数据不一致问题。
阅读全文