Linux C 进程间的IPC通信 之 共享内存(二)
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通信 之 共享内存(二)相关推荐
- Linux C 进程间的IPC通信 之 共享内存(一)
1.IPC(inter - process communication)通信 共享内存.消息队列.信号灯 2.库 <sys/shm.h> 2-1 创建共享内存 int shmget( k ...
- Linux C 进程间的IPC通信 之 消息队列(2)
Linux C 进程间的IPC通信 之 消息队列 双向通信 代码:(进程1) 1 #include <stdio.h>2 #include <sys/msg.h>3 #incl ...
- Linux C 进程间的IPC通信 之 消息队列(1)
1.消息队列 与 共享内存 1-1 消息队列 和 管道 都属于 队列结构,读完了 就被删除 不存在,但 管道 是 顺序队列 ,而 消息队列 是 链式队列 1-2 消息队列 的读和写 可设为 阻塞模 ...
- Linux C 进程间的管道通信
1.进程间的通信方式 a.管道通信:无名管道.有名管道 b.信号通信:包括信号的发送.接收和处理 c.IPC(Inter-Process Communication):共享内存.消息队列.信号灯 ** ...
- 【VxWorks系列】任务间同步与通信之共享内存
在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...
- Linux进程间同步和通信,linux进程间的同步方法
进程间通讯(IPC)方法主要有以下几种: 管道/FIFO/共享内存/消息队列/信号 1.管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非 ...
- linux进程间的通信(C): 共享内存
一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...
- 【Linux】进程间通讯
前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高. 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep "hello&q ...
- 【Linux】-- 进程间通讯
目录 进程间通讯概念的引入 意义(手段) 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载 ...
最新文章
- 学习linux基础操作,从0开始入门!
- BZOJ 2759 一个动态树好题 (LCT)
- MySQL 是如何利用索引的
- html输入框只能输入几个,input 两个input框只能允许同时输入一个
- 养不教 父母之过:10个不能靠老师解决的孩子教育问题
- C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记
- 【git系列】git命令之撤销回退篇
- 每秒处理10万订单的支付架构
- 加速失败远程计算机不能反应,2008 R2 SP1远程桌面如何开启GPU加速?不讨论虚拟机...
- java kaptcha_kaptcha Java验证码
- 让人头疼的吃鸡外挂,一起来逆向分析一波
- 通讯录 C语言分类,C语言 通讯录
- Selenium官网教程
- matlab直方图均衡化函数
- Android 图片控件ImageView
- 【报错排查】MAC系统升级后项目无法启动踩坑
- 为Python安装第三方模块
- rhel7配置smba
- word 转html 不带单引号,word单引号问题
- web.xml 解析