linux------11------共享内存的进程通信

共享内存的特性:
共享内存是最快的进程间通信的方案。不管是管道还是消息队列都必须把用户数据拷贝至内核,然后接收方再从内核中拷进来。共要进行两次拷贝,而共享内存一旦映射成功,一个进程向共享内存区写入了数据,其他共享这个内存的所有进程就能立刻看到其中的内容。
共享内存没有提供同步与互斥的机制。这部分的功能需要自己完成。若一个进程正在想共享内存区中写数据,则在它做完这一步的操作前,别的进程不应该去读或者写数据。
—————————————

共享内存的实现步骤:
1.创建共享内存区,通过shmget实现。在物理内存中开辟一块共享内存区。
2.把这块共享内存区挂接映射到两个进程的地址空间上,通过shmat实现。

      (数 据)定义变量访问共享内存
3.完成通信之后,撤销内存映射关系,通过shmdt进行脱离。(释放空间内存)
4.删除共享内存区,通过shmctl实现。

 函数原型:
int shmget(key_t key, size_t size, int shmflg);
参数: 
key:进程间通信的键值,ftok的返回值
size:共享内存的大小(以对齐1024
shmflg:标识函数的行为及共享内存的权限。取值如下:
        IPC_CREAT:如果不存在就创建共享内存(0666可读可写
        IPC_EXCL:和IPC_CREAT搭配使用,如果已经存在,则返回失败
        权限位:设置共享内存的访问权限
返回值:成功返回一个非负整数(id),即共享内存的标识符;失败返回-1
 
————————————————
注意:exit  出现异常exit(-1)  ,正常退出exit(0)

函数原型:
    void *shmat(int shmid, const void *shmaddr, int shmflg);

参数:
    shmid:共享内存标识符,shmget的返回值
    shmaddr:指定映射地址(若为NULL,则由系统自动指定)
    shmflg:共享内存的访问权限和映射条件(通常为0),取值如下:
            0:共享内存具有可读可写权限
            SHM_RDONLY:映射的内存只读
返回值: 成功返回一个指针,指向共享内存第一个节;失败返回-1  
————————————————

函数原型:
    int shmdt(const void *shmaddr);
参数:
    shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1

函数原型:       
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数:
    shmid:由shmget返回的共享内存的标识码
    cmd:将要采取的动作,有如下取值:
        IPC_RMID:删除共享内存
        IPC_SET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值
        IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
        SHM_LOCK:锁定共享内存段(超级用户)
        SHM_UNLOCK:解锁共享内存段
    buf:指向一个保存着共享内存的模式状态和访问权限的数据结构(不关心 0
返回值:成功返回0;失败返回-1
————————————————

需要两个程序进程 都是相同的操作

一般A创建之后,B就不需要创建,将创建的地方设为0,A为写的话,B就读

A

int main(){

key_t key;
     key=ftok(".",'1');
int id=shmget(key,1024*3,IPC_CREAT|0666);
 if(id==-1){
        printf("creat space error\n");
        exit(-1);
      }
char *buf=shmat(id,NULL,0);
   strcpy(buf ,"pengyuandanhenhard"); //write
    sleep(7);
     shmdt(buf);
    shmctl(id,IPC_RMID,0);

B

int main(){

key_t key;
  key=ftok(".",'1');

int id=shmget(key,1024*3,0);
 if(id==-1){
        printf("creat space error\n");
        exit(-1);
      }
char *buf=shmat(id,NULL,0);
  // strcpy(buf ,"pengyuandanhenhard"); //write
    //    sleep(7);
 printf("get data is :%s",buf);
     shmdt(buf);
    shmctl(id,IPC_RMID,0);

先运行a然后b

补充:怎么查看操作系统中有哪些共享内存

            ipcs -m

          如何把共享内存删掉

           ipcs -m  id号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追着太阳跑1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值