共享内存的实现分为两步:
1、创建共享内存,用到的函数是shmget();
2、映射共享内存,就是把这段创建的共享内存映射到具体的进程空间去,使用的函数是:shmat();
这样就可以使用不带缓冲的I/O读写命令对其进行操作了。
实例如下:
/*
* shmem.c
*
* Created on: 2012-7-20
* Author: liwei.cai
*/
/**
* 该实例说明:如何使用基本的共享内存函数。
* 功能:首先创建一个共享内存区,之后创建子进程,在父子进程中将共享内存
* 分别映射到各自的进程地址空间中。
* 父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之
* 后往共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程
* 一直等待共享内存的头部字符串是“WROTE”,然后将共享内存的有效数据打印
* 出来,之后父子进程分别解除与共享内存的映射。
* 最后在子进程中删除共享内存。
*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 2048
int main()
{
pid_t pid;
int shmid;
char *shm_addr;
char flag[] = "WROTE";
char *buff;
//创建共享内存
if ((shmid = shmget(IPC_PRIVATE, BUFFER_SIZE, 0666)) < 0)
{
perror("shmget");
exit(1);
}
else
{
printf("Create shared-memory: %d\n", shmid);
}
//显示共享内存的情况
system("ipcs -m");
pid = fork();
if (pid == -1)
{
perror("fork");
exit(1);
}
else if (pid == 0) //子进程
{
// 映射共享内存
if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
{
perror("Child: shmat");
exit(1);
}
else
{
printf("Child:Attach shared-memory: %p\n", shm_addr);
}
system("ipcs -m");
//通过检查在共享内存的头部是否标志字符串“WROTE”来确认
//父进程已经此案够共享内存写入有效数据
while(strncmp(shm_addr, flag, strlen(flag)))
{
printf("Child: wait for enable data...\n");
sleep(5);
}
//获取共享内存的有效数据并显示
strcpy(buff, shm_addr + strlen(flag));
printf("Child: Shared-memory: %s\n", buff);
//解除共享内存映射
if((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("Child: Deattach shared-memory\n");
}
system("ipcs -m");
//删除共享内存
if(shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("Child: shmctl(IPC_RMID)\n");
exit(1);
}
else
{
printf("Delete shared-memory\n");
}
system("ipcs -m");
}
else //父进程
{
//映射共享内存
if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
{
perror("Parent: shmat");
exit(1);
}
else
{
printf("Parent:Attach shared-memory: %p\n", shm_addr);
}
sleep(1);
printf("\n Input some string: \n");
fgets(buff, BUFFER_SIZE,stdin);
strncpy(shm_addr + strlen(flag), buff, strlen(buff));
strncpy(shm_addr, flag, strlen(flag));
//解除共享内存映射
if((shmdt(shm_addr)) < 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("Parent: Deattach shared-memory\n");
}
system("ipcs -m");
waitpid(pid, NULL, 0);
printf("Finished\n");
}
exit(0);
}
运行调试的时候出现,堆栈错误,请读者仔细阅读和修改代码,找出错误,附在下面。