这一片文章技术上基本上都是后台相关的,不过比较浅~可以当做知识扩展来看~
做项目的时候遇到 RPC 通信,就研 zhe 究 teng 了一些相关的玩意,这是背景
注意标题:本文 C 的代码需要在 window 下执行
首先我们得知道什么是 IPC 通信
Inter-Process Communication 翻译过来是进程间通信,进程间通信。进程是什么就不用解释了吧~
有两种类型的进程间通信
1、LPC 本地过程调用
2、RPC 远程过程调用
这些调用有什么乱用?
它们可以 数据传输、共享数据、通知事件、资源共享等等
可以看到 IPC 调用还是很重要的,缺之不可
那么接下来的问题就是该如何实现 IPC 通信呢?
先说几个常见和通用的
1、管道
2、文件映射
3、共享内存
4、Socket
还有一些不同操作系统下面特有的,比如 window 下的邮件槽,剪切板,动态数据交换,动态链接库
linux 下特有的信号、消息队列、信号量
在这里我们也主要讲前四种~当然我也不会原因是后面的我也没研究~
一、管道
netstat -a | grep node
上面这条命令对用过 linux 的童鞋来说应该很熟悉吧,这是 linux 里面的管道符“ | ” 的基本用法,管道的原理是什么呢?看图~
管道是一个内核的缓冲区,它的一端连接一个进程的输出,管道的另一端连接另外一个进程,负责输出,有没有一种抽象的概念了?
管道分为两种,一种是匿名管道,主要用于具有亲缘关系的进程通信,eg:node 中用 fork 或者 exec 创建的新进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var fork = require('child_process').fork; var child = fork('./client'); console.log(child.pid); console.log(process.pid); child.on('message', function(m) { console.log('Server Listen:', m); }); process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function(data) { child.send(data); }); |
代码就不解释了,及其的简单
不过我们从匿名管道中就能感觉到其局限性,必须是亲缘关系的进程才可以通信,命名管道改变了这一点
命名管道的原理是酱紫的:服务器创建一个命名管道对象,然后等待连接,客户端连接,二者可以读写数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include<stdio.h> #include<windows.h> #define PIPE_NAME L"\\\\.\\Pipe\\test" HANDLE g_hPipe = INV |