system v 共享内存
#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 共享内存的更多相关文章
- Linux进程通信之System V共享内存
前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...
- 阐述linux IPC(五岁以下儿童):system V共享内存
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix ...
- UNIX环境高级编程——System V 共享内存区
共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- php进程(线程)通信基础--System V共享内存
PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项 System V消息,--enable-sysvmsg System V信号量支持,--enable-sysvsem ...
- System V 共享内存区
1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...
- System V共享内存介绍
(一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
- Linux system v 共享内存
system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...
- System V共享内存
目录 1. 概述 2. System V共享内存API shmget shmat shmdt shmctl 3. 简单的程序 代码实现 common.h shmcreate.c shmrmid.c s ...
随机推荐
- pandas的日常笔记--查询
- CUDA 编程的基本模式
reproduced from: http://www.cnblogs.com/muchen/p/6306747.html 前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式 ...
- MongoDB之$关键字及$修改器$set $inc $push $pull $pop
一.查询中常见的 等于 大于 小于 大于等于 小于等于 等于:用':' 大于:用'$gt' 小于:用'$lt' 大于等于:用'$gte' 小于等于:用'$lte' MongoDB的操作就是 ...
- 测试--错误java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=select], {ExactMatcher:fDisplayName=select(com.rjj.demo.DemoApplicationTests)]...
异常这个错误java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=select], {ExactMatche ...
- PAT1018 (dijkstra+dfs)
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- python 最简单的爬虫
import urllib.request file=urllib.request.urlopen("http://www.qq.com") data=file.read() da ...
- Jmeter OutofMemory Error
在给一个项目做稳定性测试中,也就是长时间运行jmeter,发现两个问题: 1,在聚合报告中,throuhtput随着时间的增加也减小,从80-50...很是迷惑. 2,在jmeter运行一段时间,大概 ...
- FileReader读取文件详解
FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件. input:file 在介绍FileReader之前,先简单介绍input的file类型. <in ...
- FortiGate基本信息
1.介绍 FortiGate是全新的下一代防火墙,在整个硬件架构和系统上面都有新的设计,在性能和功能上面都有了很大提升,具有性能高.接口丰富.功能齐全.安全路由交换一体化.性价比高等优势. Forti ...
- crm作业知识点集合[三]
知识点1 我们要实现一个这样的功能,在学生表中,可以查看每个学生的报名的班级的所有的成绩,就是下图的效果 1.首先我们需要在学生表中自定义一列,这一列的内容就是一个a标签,指向另外一个页面,而我们在另 ...