#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>
#include <stdlib.h> int main(){
char *pAddr,*cAddr;
int shmid;
struct shmid_ds shmbuf;
//IPC_PRIVATE:创建新的共享内存
//S_IRUSR|S_IWUSR:写死就行了
//如果要非亲缘进程中使用共享内存
//char *name="/dev/shm/myshm1";
//key_t key = ftok(name,0);name是一个已经存在的文件,0代表是第几个共享内存
//shm_id=shmget(key,4096,IPC_CREAT);
shmid=shmget(IPC_PRIVATE,1024,S_IRUSR|S_IWUSR);
if(shmid<0){
fprintf(stderr,"shmget error ",strerror(errno));
exit(0);
}
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"shmget->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
if(fork()){
fprintf(stderr,"父进程%d\n",getpid());
pAddr=(char *)shmat(shmid,0,0);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"shmat->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
strcpy(pAddr,"oooooooooooooooooo");
sleep(3);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"shmdt beforce->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
shmdt(pAddr);//仅仅使pAddr地址无效,实际共享内存并没有释放
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"shmdt after->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
shmctl(shmid,IPC_RMID,&shmbuf);//删除共享内存,如果有其他进程在使用该段内存,则仅标记删除(status=dest),但新进来的shmat会返回失败。
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"IPC_RMID->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid); sleep(5);
exit(0);
}else{
fprintf(stderr,"子进程%d\n",getpid());
sleep(1);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
//如果要非亲缘进程中使用共享内存
//char *name="/dev/shm/myshm1";
//key_t key = ftok(name,0);name是一个已经存在的文件,0代表是第几个共享内存
//shm_id=shmget(key,4096,IPC_CREAT);
cAddr=(char *)shmat(shmid,0,0);//注意,不同进程取到的地址是不一样的
if(cAddr==(void *)-1){
fprintf(stderr,"cAddr null");
exit(0);
}
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->shmat IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid); fprintf(stderr,"get :%s\n",cAddr);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->shmdt beforce ->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
shmdt(pAddr);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->shmdt after ->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid); shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->IPC_RMID beforce ->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid);
shmctl(shmid,IPC_RMID,&shmbuf);
shmctl(shmid,IPC_STAT,&shmbuf);
fprintf(stderr,"child->IPC_RMID after ->IPC_STAT\t段的大小:%dbyte\t当前附加到该段的进程的个数:%d\t操作的最后1个进程的pid:%d\n",shmbuf.shm_segsz,shmbuf.shm_nattch,shmbuf.shm_lpid); sleep(10);
exit(0);
} return 0;
}

system v 共享内存的更多相关文章

  1. Linux进程通信之System V共享内存

    前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...

  2. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  3. UNIX环境高级编程——System V 共享内存区

    共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...

  4. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...

  5. php进程(线程)通信基础--System V共享内存

    PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项  System V消息,--enable-sysvmsg   System V信号量支持,--enable-sysvsem ...

  6. System V 共享内存区

    1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...

  7. System V共享内存介绍

    (一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...

  8. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  9. Linux system v 共享内存

    system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...

  10. System V共享内存

    目录 1. 概述 2. System V共享内存API shmget shmat shmdt shmctl 3. 简单的程序 代码实现 common.h shmcreate.c shmrmid.c s ...

随机推荐

  1. Oracle11g RAC安装

    双节点RAC环境,数据库 racdb 实例1:racdb1      实例2:racdb2 1.IP规划 名称             oracle-db1    oracle-db2PUBLIC I ...

  2. javascript 执行环境,作用域、作用域链、闭包

    1.执行环境 执行环境是JavaScript中国最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数 ...

  3. 解决在linux环境安装setuptools的相关错误

    RuntimeError: Compression requires the (missing) zlib module 缺少zlib包 解决方案     yum install zlib yum i ...

  4. Numpy数据处理函数

    Numpy函数介绍 import numpy as np #sqrt 计算各元素的平方根 arr = np.arange(10) np.sqrt(arr) array([0. , 1. , 1.414 ...

  5. 第十一章 串 (c2)KMP算法:查询表

  6. 树形DP+RMQ+尺取法 hdu4123

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 参考博客:两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race ...

  7. oracle 中decode函数用法

    学习记录: 含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 ...

  8. stm32DMA

    源和目标地址必须按数据传输宽度对齐 支持循环的缓冲器管理 可编程的数据传输数目:最大为65536 每一个通道都有一组寄存器 DMA_CPARx.DMA_CMARx是没有差别的,它们都可以存放外设的地址 ...

  9. TZOJ 二分图练习

    二分图主要是 1.如何建图,谁匹配谁,怎么匹配 2.判断求的是什么:最大匹配=最小点覆盖,最大独立子集=最小路径覆盖=最小边覆盖=图中顶点数-最大匹配 A.2733:棋盘游戏 描述 小希和Gardon ...

  10. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...