【UNIX】什么是IPC对象以及共享内存

sys V 的IPC 对象:对于内核中创建的文件对象,就是文件标识符(它引用了文件对象的全部信息)在进程中文件描述符一般使用当前最小可用值。

对于IPC标识符返回的是索引的整数值,它是全局变量的流水号,在系统中唯一分配的,若果在创建的IPC对象没有关闭,他会全局存在,只有在系统关闭的时候才关闭,这样会造成内存空间的资源被占用。

为了进程之间交换信息,内核专门留了一块内存空间,由进程映射到各自进程私有空间。

【共享内存的实现】:

1)创建/打开共享内存,这里的创建/打开和文件的创建/打开差不多,只是换了一种说法,都是在内核空间创建有一个缓存空间,提供要交换的信息

2)映射共享内存的内容,就是把共享内存的内容映射到进程的地址空间用于访问

3)撤销共享内存的映射,就是解挂的含义,进程不需要再访问共享内存的时候

4)删除共享内存的对象,就是内核系统在内存空间创建的文件描述符

具体代码如下:

/*
* key_t ftok(const char *pathname,int proj_id)
* ID是约好的ID号,可以是两个进程去访问, 
*_key(IPC_PRIVATE)父子进程之间的KEY值,不需要通过ftok函数得到
* KEY值表示IPC标识符
*

* int shmget (key_t key,int size,int shmflag);
* 这里的shmget 就像文件IO中的open函数
* key值就是ftok函数返回的值,等同以fork函数的fd
* size表示共享内存开的大小
* shmflag 表示open的权限位

* int shmat(int shmid,const void *shmaddr,int shmflag)  (attch挂载的含义)
* shmid表示要映射的内存共享去的标识符(shmget 返回标识符)
* shmaddr表示共享内存区要映射到进程空间指定地址(赋空NULL表示系统自动完成映射)
* shmflag 设置内存空间的读写权限(SHM_RDONLY,0表示共享内存可读写)
*

* int shmdt(const void *shmaddr)
* 这里撤销映射地址空间的shmaddr是shmat 函数的返回地址
* shmadd = (char *)shmat (shmid,NULL,0)
*

* int shmctl(int shmid,int cmd,struct shmid_ds *buf)
* shmid 是要操作的共享内存标识符
* cmd 表示获取对象的属性,一般是删除对象IPC_RMID
* buf 表示指定IPC_STAT/IPC_SET时用以保存/设置属性 (一般赋空NULL)
*
/

#include 
   
   
    
    
#include 
    
    
     
     	/* shmget, shmctl */
#include 
     
     
      
      	/* fork */
#include 
      
      
       
       	/* printf */
#include 
       
       
         /* exit */ #define BUFSZ 2048 int main() { pid_t pid; int shmid; if((shmid = shmget(IPC_PRIVATE, BUFSZ, 0666)) < 0){ perror("shmget"); exit(-1); } printf("process(pid=%d) created shared-memory id=%d\n", getpid(), shmid); if ((pid = fork()) < 0) { perror("fork error"); exit(1); } if (pid == 0) { printf("process(pid=%d) inherited shared-memory id=%d\n", getpid(), shmid); } else { sleep(1); /* just for display */ printf("ready to show IPC share memory status?"); getchar(); printf("two processes get the same shared memory object\n"); printf("------ Shared Memory Segments --------\n"); printf("key shmid owner "\ "perms bytes nattch status\n"); system("ipcs -m | grep 666"); printf("ready to terminate?"); getchar(); if (-1 == shmctl(shmid, IPC_RMID, NULL)) { perror("shmctl error"); } printf("removed shared-memory\n"); printf("------ Shared Memory Segments --------\n"); printf("key shmid owner "\ "perms bytes nattch status\n"); system("ipcs -m | grep 666"); } exit(0); } /* * char *shmadd * shmadd = (char *)shmat(shmid,NULL,0) <(char *)0 映射地址空间 * shmdt(shmadd) 撤销/解除进程与共享空间的映射关系 * shmctl(shmid,IPC_RMID,NULL) 删除IPC共享内存空间 */ 
       
      
      
     
     
    
    
   
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值