共享内存的使用

本文通过两个示例程序,详细介绍了如何利用共享内存实现进程间的通信。包括如何创建、读写共享内存,以及如何进行内存段的附加和脱离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://download1.youkuaiyun.com/down3/20070529/29183222619.Chttp://download1.youkuaiyun.com/down3/20070529/29183246962.Chttp://download1.youkuaiyun.com/down3/20070529/29183246962.Chttp://download1.youkuaiyun.com/down3/20070529/29183246962.C
源代是从人的文章中抄来的,不是原,不写得不,主要是描述两个不同的程从共享内存中存取数据的技,我加了点分析:

第一个是写数据:
/***** testwrite.c *******/

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
        char name[4];
        int age;
} people;
main(int argc, char** argv)
{
        int shm_id,i;
        key_t key;
        char temp;
        people *p_map;
        char* name = "/dev/shm/myshm2";
        key = ftok(name,0);
        if(key==-1)
                perror("ftok error");
/*
先用ftokR建一个key,


pshmgetR建一WW共享内存区域*/
        shm_id=shmget(key,4096,IPC_CREAT);      
        if(shm_id==-1)
        {
                perror("shmget error");
                return;
        }
/*
将ル集W共享内存区附加到自己的内存段*/
        p_map=(people*)shmat(shm_id,NULL,0);
        temp='a';
        for(i = 0;i<10;i++)
        {
                temp+=1;
                memcpy((*(p_map+i)).name,&temp,1);
                (*(p_map+i)).age=20+i;
        }
/*
写数据完ユk,将其从自己的内存段中“ R出去*/
        if(shmdt(p_map)==-1)
                perror(" detach error ");
}
/*
读进程首先要得到那内存候,ftok根据文件名和ID建的key
很用了,步建是一*/
/********** testread.c ************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
        char name[4];
        int age;
} people;
main(int argc, char** argv)
{
        int shm_id,i;
        key_t key;
        people *p_map;
        char* name = "/dev/shm/myshm2";
        key = ftok(name,0);
        if(key == -1)
                perror("ftok error");
        shm_id = shmget(key,4096,IPC_CREAT);      
        if(shm_id == -1)
        {
                perror("shmget error");
                return;
        }
        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 ");
}


gcc -o testWriter  -g testWriter.C

gcc -o testRead  -g testRead.C

ipcs
察看建的共享内存
注:事上,ftok函数仅仅是根据文件名和ID生成一个起标识作用的key,根据《GNU Linux程指南》Linux实现这一函数有点问题,不推荐用。于是我一般来都是自己定一个唯一的key,而不使用ftok函数。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值