1、父子进程(有亲缘关系)的IPC通信

int shmid;       shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777); //创建共享内存,参数为 宏 IPC_PRIVATE

int pid;       char *p;     pid = fork();

if(pid  > 0) { signal(SIGUSR2, myfun);      p = (char *)shmat(shmid, NULL, 0) ; ........kill(pid, SIGUSR1);......pause();.......}

接收信号                                            映射 共享内存                               发送信号                    睡眠等待

if(pid == 0) { signal(SIGUSR1,myfun);      p = (char *)shamt(shmid, NULL, 0); ...........pause();... ......... kill(pid,SIGUSR2);....... }

2、无亲缘关系进程间的IPC通信

int key;         key = ftok("./a",'b'); //创建 共享内存的 key 值

int shmid;          shmid = shmget(key, 128, IPC_CREAT | 0777); //创建 共享内存

struct shmbuf *p;       p = (struct shmbuf *)shmat(shmid, NULL, 0); //映射 共享内存

代码 1  父子进程:

  1 #include <stdio.h>2 #include <sys/shm.h>3 #include <signal.h>4 5 void myfun(int sig)     //自定义信号处理方式6 {7         return; //唤醒8 }9 10 int main()11 {12         int shmid;13         char *p;14         int pid;15 16         shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777);     //在内核空间创建 共享内存17         if(shmid < 0)18         {19                 printf("ERROR: share memory create failure.\n");20                 return -1;21         }22         printf("share memory shmid = %d\n", shmid);23 24         pid = fork();   //父子进程25         if(pid > 0)     //父进程26         {27 28                 signal(SIGUSR2, myfun); //接收处理 子进程发送的信号29                 p = (char *)shmat(shmid, NULL, 0);      //通知内核 将共享内存 映射到 用户空间的地址中30                 if(p == NULL)   //小心:不要写成 =,否则,编译器可以通过。执行时将出现 段错误31                 {32                         printf("ERROR: parent process shmat operation failure.\n");33                         return -2;34                 }35                 while(1)36                 {37                         printf("parent process pid = %d: write into share memory...\n",getpid());38                         fgets(p, 128, stdin);   //写入 共享内存39                         kill(pid,SIGUSR1);      //发送信号 给 子进程,将其唤醒 通知其可以读取40                         pause();        //睡眠,等待 子进程读取41                 }42         }43         if(pid == 0)    //子进程44         {45                 signal(SIGUSR1, myfun);46                 p = (char *)shmat(shmid, NULL, 0);      //通知内核 将共享内存 映射到 用户空间的地址中47                 if(p == NULL)48                 {49                         printf("ERROR: child process shmat operation failure.\n");50                         return -3;51                 }52                 while(1)53                 {54                         pause();        //睡眠,等待 父进程写入55                         printf("child process pid = %d read parent pid = %d: %s\n", getpid(), getppid(), p);    //读取 共享内存56                         kill(getppid(),SIGUSR2);        //发送信号 给 父进程,将其唤醒 通知其可以写入57                 }58         }59         shmdt(p);       //删除 用户空间中 共享内存的地址映射60         shmctl(shmid,IPC_RMID,NULL);    //删除 内核空间中 的共享内存61         system("ipcs -m");      //查看 共享内存62         return 0;63 }

执行1:

代码 2-1 进程server:

  1 #include <stdio.h>2 #include <sys/shm.h>3 #include <signal.h>4 5 struct shmbuf   //结构体6 {7         int pid;8         char buf[124];9 };10 11 void myfun(int sig)     //自定义信号处理方式12 {13         return; //唤醒14 }15 16 int main()17 {18         int shmid;19         int key;20         int pid;21         struct shmbuf *p;22 23         signal(SIGUSR2, myfun);         //接收信号,并处理24 25         key = ftok("./a",'b');  //创建共享内存的 key值26 27         shmid = shmget(key, 128, IPC_CREAT | 0777);     //创建 共享内存28 29         printf("server share memory shmid = %d, key = %X\n", shmid, key);30 31         p = (struct shmbuf *)shmat(shmid, NULL, 0);     //映射 共享内存32 33         p->pid = getpid();      //将自己的pid 写入 共享内存34         pause();        //睡眠,等待对方 读取 pid35         pid = p->pid;   //读取 对方写入的 pid36 37         while(1)38         {39                 printf("server write into share memory......\n");40                 fgets(p->buf, 124, stdin);      //写入 共享内存41                 kill(pid, SIGUSR1);     //发送信号,通知对方42                 pause();        //睡眠,等待43         }44         return 0;45 }

代码 2-2 进程 client::

  1 #include <stdio.h>2 #include <sys/shm.h>3 #include <signal.h>4 5 struct shmbuf   //结构体6 {7         int pid;8         char buf[124];9 };10 11 void myfun(int sig)     //自定义信号处理方式12 {13         return;14 }15 16 int main()17 {18         int key;19         int shmid;20         struct shmbuf *p;21         int pid;22 23         signal(SIGUSR1, myfun); //接受信号,并处理24         key = ftok("./a",'b');  //创建共享内存的key值25         if(key < 0)26         {27                 printf("ERROR: client process create key of shm failed.\n");28                 return -1;29         }30 31         shmid = shmget(key, 128, IPC_CREAT | 0777);     //创建共享内存32         if(shmid < 0)33         {34                 printf("ERROR: client process create share memory failed.\n");35                 return -2;36         }37         printf("share memory shmid = %d, key = %X\n", shmid, key);38 39         p = (struct shmbuf *)shmat(shmid, NULL, 0);     //将 内核中的 共享内存 映射到 用户空间的地址中40         if(p == NULL)41         {42                 printf("ERROR: client process shmat operation failure.\n");43                 return -3;44         }45         pid = p->pid;   //读取 server端 写入的 pid46         p->pid = getpid();      //写入自己的pid47         kill(pid, SIGUSR2);     //发送信号,通知server48         while(1)49         {50                 pause();        //睡眠,等待 server写入51                 printf("client read : %s\n", p->buf);   //读取 共享内存52                 kill(pid, SIGUSR2);     //发送信号,通知 server 读取完毕,可以 写入53         }54 55         shmdt(p);56         shmctl(shmid, IPC_RMID, NULL);57         system("ipcs -m");58 59         return 0;60 }

执行 2:

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

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

    1.IPC(inter - process communication)通信 共享内存.消息队列.信号灯 2.库 <sys/shm.h> 2-1  创建共享内存 int shmget( k ...

  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. 学习linux基础操作,从0开始入门!
  2. BZOJ 2759 一个动态树好题 (LCT)
  3. MySQL 是如何利用索引的
  4. html输入框只能输入几个,input 两个input框只能允许同时输入一个
  5. 养不教 父母之过:10个不能靠老师解决的孩子教育问题
  6. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记
  7. 【git系列】git命令之撤销回退篇
  8. 每秒处理10万订单的支付架构
  9. 加速失败远程计算机不能反应,2008 R2 SP1远程桌面如何开启GPU加速?不讨论虚拟机...
  10. java kaptcha_kaptcha Java验证码
  11. 让人头疼的吃鸡外挂,一起来逆向分析一波
  12. 通讯录 C语言分类,C语言 通讯录
  13. Selenium官网教程
  14. matlab直方图均衡化函数
  15. Android 图片控件ImageView
  16. 【报错排查】MAC系统升级后项目无法启动踩坑
  17. 为Python安装第三方模块
  18. rhel7配置smba
  19. word 转html 不带单引号,word单引号问题
  20. web.xml 解析

热门文章

  1. 【ROS2要素】xml、GDF、URDF的关系
  2. activiti 网页流程设计器 的使用
  3. 图像在计算机储存的是什么意思,数字医学图像计算机存储与传输技术.ppt
  4. modernizr简介
  5. 字幕剪切视频神器AutoCut的安装和使用
  6. 鬼笔环肽蛋白研究——罗丹明标记鬼笔环肽
  7. (内附免费下载地址)全网免费获取地形数据的方法
  8. MATLAB中果蝇味道浓度判定函数,果蝇优化算法的分析.PDF
  9. IBM X3500 M4服务器网卡驱动
  10. M7450,M7450F,M7400,M7650,系列固件升级程序