【av68676164(p33-p34)】进程通信
4.7.1 匿名管道通信
任务:把一个CMD控制台程序改成窗口程序

“算命大师”程序的改进版
改进目标:标准的Windows窗口程序

(匿名)管道通信机制
管道定义 pipe

定义:管道是进程间的一种通信机制,一个进程(A)可以通过管道把数据传输到另外一个进程(B)。前者(A)向管道输入数据,后者(B)从管道读取数据
管道的工作原理

- 管道象文件一样,可读和可写,有读/写2个句柄。 CreatePipe(Handle W, Handle R)
- 通过写写句柄(W)向管道中写数据: WriteFile(W, Buffer) 或通过输出重定向向写句柄(W)写入。
- 通过读读句柄(R)从管道中读数据: ReadFile{R, Buffer) 或通过输入重定向从读句柄(R)读出。
注意事项:仅能用于父子或兄弟进程中通信

- 由父进程 (A)创建管道: CreatePipe(W, R)。
- 由父进程 (A)创建子进程 (B) : CreateProccess()
- 父进程写或读管道,子进程输入或输出重定向到管道。
两个示例


应用管道的注意事项
双向通信必须建立2个管道
要支持程序见双向通信,父进程(A)必须创建2个管道
“算命大师”程序的改进版实现
设计思路
- 由父进程 (A)创建管道: CreatePipe(W, R)。
- 由父进程 (A)创建子进程 (B) : CreateProccess()
- 父进程写或读管道,子进程输入或输出审定向到管道。
关键函数和代码
父进程(即算命大师改进版程序)创建2个管道
CreatePipe(&hPipe_1_ReadHandle, &hPipe1_WriteHandle, &sa, 0);
CreatePipe(&hPipe_2_ReadHandle, &hPipe2_WriteHandle, &sa, 0);
父进程创建子进程(算命大师的原始版程序),隐藏它并输入/输出重定向到管道
StartInfo.wShowWindow = SW_HIDE;
StartInfo.hStdInput = hPipe_ReadHandle;
StartInfo.hStdOutput = hPipe2_WriteHandle;
::CreateProcess(NULL, "算命大师.exe", NULL, NULL, true, 0, NULL, NULL, &StartInfo, &PiInfo);
父进程把用户输入的日期写道管道1的写句柄上,传给算命大师原始版程序
GetDlgItem(IDC_EDIT_DATE)->GetWindowsText(csDate);
::WriteFile(hPipe1_WriteHandle, csDate, nLen, &writeBytes, NULL);
父进程读取管道2的读句柄,以获取算命大师原始版程序的结果,并显示出
ReadFile(hPipe2_ReadHandle, bufferResult, 1023, &IBytesRead, 0);
GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(bufferReuslt);
4.7.2 Linux信号通信
信号的概念(Signal)
- 信号是Linux进程间一种重要的通信机制。
- 信号是向进程发送的一个通知,通知某个事件已发生。
- 收到信号的进程可以立即执行指定的操作。
- 信号的发出可以是进程,也可以是系统(含硬件)。
终端上使用信号机制的例子
例子1:键盘上按下Ctrl+C杀死一个进程
说明:
Ctrl+C产生信号SIGINT- 进程收到SIGINT信号,执行默认操作(结束进程)
例子2:键盘上按下Ctrl+Z暂停(挂起)一个进程
说明:
Ctrl+Z产生信号SIGTSTP- 进程收到SIGTSTP信号,执行默认操作(挂起进程)
例子2:终端命令kill -9杀死一个进程
说明:
kill -9产生信号SIGKILL- 进程收到SIGKILL信号,执行默认操作(强制结束进程)
信号的产生
- 来源1 : 键盘输入特殊组合键产生信号,例: " Ctrl + C"
- 来源2 : 执行终端命令产生信号,例: kill系列命令
- 来源3 : 程序中调用函数产生信号,例: kill()、 abort()
- 来源4:硬件异常或内核产生相应信号。例:内存访问错
信号的定义
Linux定义了64种信号,信号用整数1-64表示
| 信号编号 | 信号名称 | 说明 |
|---|---|---|
| 2 | SIGINT | 进程结束(按键 CTRL+ C能产生) |
| 6 | SIGABRT | 进程结束 ( 调用 abort函数产生) |
| 9 | SIGKILL | 进程强制结束(用户不能捕获该信号) |
| 11 | SIGUSR1 | 用户自定义信号 1 |
| 14 | SIGALRM | 定时器时间到的信号 |
| 19 | SIGTSTP | 进程暂停执行(用户不能捕获该信号) |
信号机制编程:例子1
任务:编写一个死循环程序,当其收到键盘按下的 CTRL+ C信号后,输出“BYE BYE”,然后退出。
#include <iostream>
#include <unistd.h>
int main() {
printf("int_handler set for SIGNIT\n");
while (1) {
printf("go to sleep\n");
sleep(6);
}
return 0;
}

思路:让进程对Ctrl+c的SIGNIT信号用自定义的信号处理函数相应,在自定义信号处理函数输出“BYE BYE”后结束
signal():注册信号处理函数的函数
原型
void signal(
int SigNo, //信号编号
void (* Handle) int //信号自定义处理函数
)
功能:
为指定信号注册信号处理函数。当进程收到SigNo信号时,立即自动调用 Handle函数执行。一般在进程初始化时使用该函数注册信号处理函数。
#include <iostream>
#include <unistd.h>
void int_handler(int signum) {
printf("\nBYE BYE \n");
exit(-1);
}
int main() {
signal(SIGINT, int_handler);
printf("int_handler set for SIGNIT\n");
while (1) {
printf("go to sleep\n");
sleep(6);
}
return 0;
}

信号机制编程:例子2
任务:一个进程(父进程)等待另一个死循环的进程(子进程)先结束并向自己BYE BYE后,自己再结束。
思路:父进程主动发送一个信号给子进程,子进程收到之后 立即准备结束。子进程中设置信号处理函数,提前结束自己,并向父进程“BYE- BYE!“。

kill():发送信号的函数
原型:
void kill(
int PID, //接受信号的目标进程的ID
int SigNo //待发送的信号
)
功能:
向着目标进程PID发送SigNo信号

【av68676164(p33-p34)】进程通信的更多相关文章
- Linux学习笔记(13)-进程通信|命名管道
匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- Windows进程通信 -- 共享内存(1)
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- WinForm实现跨进程通信的方法
public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...
- 进程通信之一 使用WM_COPYDATA C++及C#实现(转)
进程间通信最简单的方式就是发送WM_COPYDATA消息.本文提供C++及C#程序相互通信的二种实现方式.这样消息的接收端可以用C++实现,发送端可以用C++或C#实现. 发送WM_COPYD ...
- [转]WINDOW进程通信的几种方式
windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...
随机推荐
- python 并发专题(十):基础部分补充(二)线程
什么是线程 标准描述开启一个进程:开启一个进程:进程会在内存中开辟一个进程空间,将主进程的资料数据全部复制一份,线程会执行里面的代码. ***进程是资源单位, 线程是执行单位:是操作系统调度的最小单元 ...
- python 面向对象专题(九):特殊方法 (二)__get__、__set__、__delete__ 描述符(二)覆盖型与非覆盖型描述符对比
前言 根据是否定义__set__ 方法,描述符可分为两大类. 实现 __set__ 方法的描述符属于覆盖型描述符,因为虽然描述符是类属性,但是实现 __set__ 方法的话,会覆盖对实例属性的赋值操作 ...
- Vmware虚拟机下不能访问网络的解决办法之一
Vmware虚拟机下不能访问网络的解决办法之一 1.这个是默认的网络设置 2.如果不能访问网络,看下VMware相关的服务有没有打开,win+R 3.找到VMware的相关选项,全部启用(当然网络可能 ...
- 从JDK源码理解java引用
目录 java中的引用 引用队列 虚引用.弱引用.软引用的实现 ReferenceHandler线程 引用队列的实现 总结 参考资料 java中的引用 JDK 1.2之后,把对象的引用分为了四种类型, ...
- 互联网的寒冬下各大一线互联网公司还在用SpringBoot这是为什么?
引言 现在各大技术社区 Spring Boot 的文章越来越多,Spring Boot 相关的图文.视频教程越来越多,使用 Spring Boot 的互联网公司也越来越多: Java 程序员现在出去面 ...
- 面试锦囊 | HTTP 面试门路
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 Github 博客 学习清单: 零.前置知识 幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同 一.PUT ...
- 题解 洛谷 P5331 【[SNOI2019]通信】
考虑用费用流解决本题. 每个哨站看作一个点,并将其拆为两个点,建图方式为: \(S \longrightarrow x_i\) 容量为\(1\),费用为\(0\) \(x_i \longrightar ...
- 题解 洛谷 P2280 【[HNOI2003]激光炸弹】
这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上. 经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值 ...
- Java基础单词总结
单词总结 Actualpayment --- 实际付款 Aggregatemount --- 合计金额 MemberPoints --- 会员积分 Management --- 管理 ...
- emacs org-mode 中文手册精简版(纯小白)
一只小白看了大佬的讲解视频结合其他大佬给整理的笔记再结合emacs 官方英文手册,觉得自己的知识好像增加了. 当时自己在全网搜索的时候没有看到那种纯小白的手册,本小白就写了这个,就当奉献社会了.若有不 ...