7、linux进程间通信之共享内存

 

                                   共享内存

                    共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存的区域的所有进程就可以立刻看到其中的内容。

                     共享内存实现可以分为两个步骤

Ø         创建共享内存,使用shmget函数

Ø         映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数

 

                            创建

                int shmget (key_t key,int size,int shmflg)

       key标识共享内存的键值:O/IPC_PRIVATE。当key懂得取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。

              返回值:成功,返回共享内存标识符(IP)。失败返回-1.

Ø         key= IPC_PRIVATE

Ø         Key=0,shmflg= IPC_PRIVATE 

                     其中一个成立就创建新内存

 

                            映射

              int shmat (int shmid, char *shmaddr, int flag)

参数:

Ø         Shmid:shmget函数返回的共享内存标识符(IP).

Ø         Flag:决定以什么方式来决定映射的地址(通常为0)

Ø         Shmaddr 这个地址可以自己指定,但当shmaddr=0表示由系统自动分配一个地址

 

                     返回值:成功,返回共享内存映射到进程中的地址,失败,-1。

 

              当一个进程不再需要共享内存时,需要把它从进程地址空间中解脱。

                     Int shmdt (char *shmaddr)

 

 

 

 

           例题:shmem.c

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

 

#define PERM S_IRUSR|S_IWUSR

/* 共享内存 */

 

int main(int argc,char **argv)

{

    int shmid;

    char *p_addr,*c_addr;

   

    if(argc!=2)

    {

        fprintf(stderr,"Usage:%s\n\a",argv[0]);

        exit(1);

    }

 

    /* 创建共享内存 */  

    if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)

    {

        fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));

        exit(1);

    }

 

    /* 创建子进程 */

    if(fork()) // 父进程写

    {

        p_addr=shmat(shmid,0,0);

        memset(p_addr,'\0',1024);    //1024表示内存的大小,‘\0’表示1024个字节全部是结束标志,p_addr表示地址

        strncpy(p_addr,argv[1],1024);  //1024表示内存大小 argv[1]中的内存拷贝到           //p_addr中

        wait(NULL); // 释放资源,不关心终止状态

        exit(0);

    }

    else       // 子进程读

    {

        sleep(1); // 暂停1秒 防止子进程先运行

        c_addr=shmat(shmid,0,0);

        printf("Client get %s\n",c_addr);

        exit(0);

    }

}

 

 

            运行:

                # ./shmem 1234

                # Client get 1234

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值