第17章、进程间的通信
1. 当一个进程启动后,操作系统为其分配4GB的私有地址空间。位于同一个进程中的多个线程共享同一个地址空间,因此线程之间的通信非常简单;
2. 四种进程间通信方式:剪切板,匿名管道,命名管道,邮槽;
3. 如果某个程序已经打开了剪贴板,则其他应用程序将不能修改剪切板,直到前者调用了CloseClipboard函数。
4. 剪切板格式;
5. 如果在剪切板上放置的数据过大,就会浪费内存空间,降低对资源的利用率,为了避免这种浪费,就可以采用延迟提交技术;(即直到有其他进程需要数据或者自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据)
6. 首先调用OpenClipboard打开剪切板,如果成功打开,则调用EmptyClipboard函数清空剪切板,释放剪切板上数据的句柄,并将剪切板的所有权分配给当前窗口;
在把数据放置到剪切板后之后,一定要记住调用CloseClipboard函数关闭剪贴板,否则其他进程将无法打开剪贴板;
7. 匿名管道是一个未命名的,单向管道,通常用来在一个父进程和一个子进程之间传输数据。
匿名管道只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信;
8,在这以前的章节中,凡是需要SECURITY_ATTRIBUTES结构体指针的地方,我们传递的都是NULL值,让系统为创建的对象赋予默认的安全描述符,而函数所返回的句柄将不能被子进程所继承。但本章不行;
9.因为匿名管道没有名称,所以只能在父进程中调用CreateProcess函数创建子进程,将管道的读,写句柄传递给子进程;
10.四种剪贴板的比较:
1. 剪贴板和匿名管道只能实现同一台机器两个进程间的通信,而不能实现跨网络的通信;
2. 而命名管道和邮槽还可以实现网络的进程间通信;
3. 邮槽可以实现一对多通信,而命名管道只能是点对点的单一通信,但是邮槽的缺点是数据量小,通常是在424字节以下,如果数据量大,则采用命名管道来完成;