LINUX 共享内存

共享内存有什么用?

共享内存是Linux进程间通信的一种手段,即协助进程间通信

共享内存的一般使用步骤

1.使用int shmget(ket_t key ,size_t size , int shmflg), 向系统申请共享内存,大小为size字节,并且获取进程的操作标识符,通过返回值返回。

int shmid = shmget(key , 1024 ,IPC_CREAT | 0644 );

IPC_CREAT:创建文件

0644:给文件设置用户的读写权限


shm_id :获取的共享内存空间标识符通过shmget()申请的共享内存空间不能被任何进程访问,shmat就是将该共享内存空间链接到当前进程的地址空间。2.void *shmat(int shm_id, const void *shm_addr, int shm_flg);

  • shm_addr :指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
  • shm_flg :通常为一组标识符,通常为 0

3.int shmctl(int shm_id, int command, struct shmid_ds *buf);

  • shmctl()可根据第二个参数不同来实现不同的功能,当commmand为IPC_STATE(获取标识符为shm_id的共享内存信息,并将其存储在buf中,),IPC_SET(将buf中的信息设置成,shm_id所代表的共享内存空间的信息),IPC_RMID(删除共享内存空间,buf传入NULL)

4.int shmdt(const void *shmaddr)

  • 将shmaddr指向的共享内存空间与当前进程断开连接,并不是删除该共享内存空间,只是当前进程不可访问
#include <stdio.h>
#include <unistd.h>
#include <sys/shm.h>

int key=0x12345;
int main(){
    //申请共享内存,
    //设置共享内存大小,
    //权限,
    //返回值:获取共享内存句柄
    int shmid = shmget(key,1024,IPC_CREAT | 0664);
    if(shmid < 0){
        perror("shmget\n");
        return 1;
    }
    //创建shmid_ds buf 接收共享内存信息
    struct shmid_ds buf;
    //int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    //cmd:IPC_STAT :获取shmid共享内存空间的信息,将其存储在buf中
    
    shmctl(shmid,IPC_STAT,&buf);
    printf("shmid.size:->%ld\n",buf.shm_segsz);
    //shmat:获取shmid的内存地址(将共享内存地址链接到当前程序)
    //第一次创建完共享内存时,
    //它还不能被任何进程访问,
    //shmat()函数的作用就是用来启动对该共享内存的访问,
    //并把共享内存连接到当前进程的地址空间
    
    void* lp = shmat(shmid,NULL,0);
    
    if(!lp){
        perror("shmat\n");
        return 1;
    }
    while(1){
        sprintf((char*)lp,"%s","hello ! i am writing!\n");
        sleep(1);
    }
    shmdt(lp);
    shmctl(shmid,IPC_RMID,NULL);
    

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值