linux应用程序之共享内存

作者在 2010-10-13 11:44:54 发布以下内容
/*
   共享内存的写程序
1.首先调用ftok()函数将一个路径名转化为key
2.调用shmget();函数,来返回一个共享内存地址
3.调用shmat()函数映射共享内存到本进程内存空间
4.调用shmdt()函数删除共享内存.
*/
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#define SIZE 4096

typedef struct
{
    char name[4];
    int age;
}people;

int main(int argc,char **argv)
{
    int shm_id,i,fd;
    key_t key;
    char temp;
    people *p_map;
    char *name="/home/program/shm/shm.txt";
    if((fd=open("/home/program/shm/shm.txt",O_RDWR|O_CREAT))<0)//保证文件的存在,否则ftok()会出错
    {
        perror("open");
        exit(1);
    }
    key=ftok(name,0);
    if(key==-1)
    {
        perror("ftok error");
        exit(1);
    }
    shm_id=shmget(key,SIZE,IPC_CREAT);
    if(shm_id==-1)
    {
        perror("shmget");
        exit(1);
    }
    p_map=(people *)shmat(shm_id,NULL,0);
    temp='a';
    for(i=0;i<10;i++)
    {
        memcpy((*(p_map+i)).name,&temp,1);
        (*(p_map+i)).age=20+i;
        temp+=1;
    }
    if(shmdt(p_map)==-1)
        perror("detach error");
    return 0;
}
/*程序 read_shm.c*/
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#define SIZE 4096
typedef struct
{
    char name[4];
    int age;
}people;

int main(int argc,char **argv)
{
    int shm_id,i;
    key_t key;
    char temp;
    people *p_map;
    char *name="/home/program/shm/shm.txt";
    key=ftok(name,0);
    if(key==-1)
        perror("ftok error");
    shm_id=shmget(key,SIZE,IPC_CREAT);
    p_map=(people *)shmat(shm_id,NULL,0);
    for(i=0;i<10;i++)
    {
        printf("name:%s \n",(*(p_map+i)).name);
        printf("age %d \n",(*(p_map+i)).age);
    }
    if(shmdt(p_map)==-1)
        perror("detach error");
    return 0;
}
默认分类 | 阅读 1260 次
文章评论,共1条
变幻小子
2011-03-18 12:16
1
路过看看
游客请输入验证码
浏览48269次
文章分类