1、IPC(inter - process communication)通信

共享内存、消息队列、信号灯

2、库 <sys/shm.h>

2-1  创建共享内存

int shmget( key_t key, int size, int shmflg);

key : IPC_PRIVATE 或 ftok() 返回值

前者创建的共享内存 类似于 无名管道,只能实现 有亲缘关系 进程间的通信

例:int shmid;        shmid = shmget( IPC_PRIVATE, 128, 0777);

后者创建的共享内存 类似于 有名管道,可实现 无亲缘关系 进程间的通信

size : 大小                 shmflg : 权限

char ftok( const *path, char key);

例:int shmid;    int key;    key = ftok( "./a", 'b');        shmid = shmget( key, 128, IPC_CREAT | 0777);

2-2  通知 内核 将 共享内存 映射到 用户空间的地址中

映射到用户空间后,每次读写 共享内存 将无需 进入 内核

void *shmat( int shmid, const void *shmaddr, int shmflg);

shmflg : SHM_RDONLY  只读                     默认为0     可读可写

例:char *p;       p = (char *)shmat( shmid, NULL, 0);

2-3  删除用户空间中共享内存的地址映射

int shmdt( const void *shmaddr )

例:shmdt( p );

2-4  删除内核空间中共享内存

int shmctl( int shmid, int cmd, struct shmid_ds *buff);

cmd : IPC_STAT     获取对象属性      IPC_SET      设置对象属性          IPC_RMID   删除对象

例:shmctl( shmid, IPC_RMID, NULL);

2-5  读写

写    fgets( p, 128, stdin);       写到哪里去、写多少个、写什么

读    printf( "%s", p);

2-6  特点

共享内存 创建之后,一直存在于 内核 中,直到 被删除 或 系统关闭

3、命令

查看IPC: ipc -m 共享内存      -q   消息队列     -s  信号灯

例:代码 system(" ipc -m")        命令   ipc -m

删除IPC:ipcrm -m <id>

例:代码 system(" ipcrm -m shmid")      命令 ipcrm -m <id>

代码:

  1 #include <stdio.h>2 #include <sys/shm.h>    //共享内存3 #include <string.h>     //memcpy()4 5 int main()6 {7         int shmid;8 9         int key;10 11         char *p;12 13         //创建共享内存14         //shmid = shmget(IPC_PRIVATE, 128, 0777);       //参数IPC_PRIVATE创建的共享内存 类似于 无名管道15 16         key = ftok("./a",'b');  //参数:文件路径及文件名、标识符17         if(key < 0)18         {19                 printf("create key failure.\n");20                 return -1;21         }22         printf("key = %X\n",key);23 24         //创建共享内存25         //shmid = shmget(key, 128, 0777);       //报错26         shmid = shmget(key, 128, IPC_CREAT | 0777);     //参数为ftok()的返回值 创建的共享内存 类似于 有名管道27         if(shmid < 0)28         {29                 printf("share memory create failure\n");30                 return -1;31         }32         printf("share memory 128M, shmid = %d\n.", shmid);33         system("ipcs -m");      //查看共享内存34         //system("ipcrm -m shmid");     //报错:参数解析失败35 36         //通知内核将共享内存 映射到 用户空间的地址中37         p = (char *)shmat(shmid, NULL, 0);38         if(p < 0)39         {40                 printf("shmat operation failure.\n");41                 return -1;42         }43         printf("***shmat success\n");44         //写入 45         fgets(p, 128, stdin);   //写入共享内存:写到哪里去、写多少个、写什么46         //读取 47         printf("share memory data: %s\n", p);48 49         shmdt(p);       //删除 共享内存在用户空间的地址映射50         //memcpy(p,"abcd",4);   //删除映射后,再对该地址进行操作时,段错误!51         shmctl(shmid, IPC_RMID, NULL);        //删除内核空间的 共享内存52         system("ipcs -m");53         return 0;54 }

执行:

代码:通过 shmctl( shmid, IPC_RMID, NULL );  实现 命令“ ipcrm -m <id> ” 删除内核中 共享内存 的功能

  1 #include <stdio.h>2 #include <sys/shm.h>3 4 int main(int argc, char *argv[])5 {6         int shmid;7         if(argc < 3)8         {9                 printf("please enter more parameter.\n");10                 return -1;11         }12         if(strcmp(argv[1],"-m") != 0)13         {14                 return -1;15         }16         printf("delete share memory.\n");17         shmid = atoi(argv[2]);  //atoi() 字符串 转为 整型18         shmctl(shmid, IPC_RMID, NULL);  //等同于 ipcrm -m <shmid>19         system("ipcs -m");20         return 0;21 }

Linux C 进程间的IPC通信 之 共享内存(一)相关推荐

  1. Linux C 进程间的IPC通信 之 共享内存(二)

    1.父子进程(有亲缘关系)的IPC通信 int shmid;       shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777); //创建共享内存,参数 ...

  2. Linux C 进程间的IPC通信 之 消息队列(2)

    Linux C 进程间的IPC通信 之 消息队列 双向通信 代码:(进程1) 1 #include <stdio.h>2 #include <sys/msg.h>3 #incl ...

  3. Linux C 进程间的IPC通信 之 消息队列(1)

    1.消息队列 与 共享内存 1-1 消息队列  和 管道 都属于 队列结构,读完了 就被删除 不存在,但 管道 是 顺序队列 ,而 消息队列 是 链式队列 1-2  消息队列 的读和写 可设为 阻塞模 ...

  4. Linux C 进程间的管道通信

    1.进程间的通信方式 a.管道通信:无名管道.有名管道 b.信号通信:包括信号的发送.接收和处理 c.IPC(Inter-Process Communication):共享内存.消息队列.信号灯 ** ...

  5. 【VxWorks系列】任务间同步与通信之共享内存

    在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...

  6. Linux进程间同步和通信,linux进程间的同步方法

    进程间通讯(IPC)方法主要有以下几种: 管道/FIFO/共享内存/消息队列/信号 1.管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非 ...

  7. linux进程间的通信(C): 共享内存

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  8. 【Linux】进程间通讯

    前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高. 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep "hello&q ...

  9. 【Linux】-- 进程间通讯

    目录 进程间通讯概念的引入 意义(手段) 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载 ...

最新文章

  1. boost::filesystem::copy用法的测试程序
  2. SQL:JOIN ON
  3. sed、head、grep、tail、EOF
  4. JAVA synchonized Lock类----简单总结笔记
  5. 经常会用到的ocr文字识别工具:Text Scanner for Mac
  6. Hyperledger Fabric blockchain explorer 重启
  7. 挖掘机液压控制系统实训QY-JXSX09
  8. 手机sim卡插到电脑上网_怎么用手机卡在电脑上上网
  9. python怎么输入正整数_python判断所输入的任意一个正整数是否为素数的两种方法...
  10. 有监督学习(supervised learning))与无监督学习(unsupervised learning)之间有何区别?
  11. word毕业论文格式排版修改
  12. 计算机英语四六级成绩查询,全国四六级英语成绩查询入口网址-http://cet.neea.edu.cn/cet...
  13. mysql将毫秒转换为小时_将毫秒转换为天小时分钟
  14. oracle mod函数
  15. 259-数据明文传输的安全问题
  16. 互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率
  17. 推荐几本书给大家(二)
  18. Qt中LineEdit编辑框限制数字输入整理
  19. 如何购买服务器及域名(阿里)
  20. Pandas Task6——综合练习

热门文章

  1. 全面科普科技类展厅中的互动投影翻书系统
  2. 看“我猜我猜我猜猜猜”
  3. 微信公众号文章同步攻略
  4. 运营商车联网布局再提速 智能化创新激发产业热情
  5. 历史上最好用的日程管理软件,完全免费
  6. 7.Java基础之集合框架+JDK8新特性
  7. IC入职新同学必备技能手册①
  8. 纽顿集团在纳斯达克上市:IPO首日下跌63%,市值大幅缩水
  9. Windows下的本地提权漏洞梳理及后渗透简析
  10. win7卸载avast杀毒软件的步骤--win10专业版