月黑风高,突然砰的一声,web服务器的目录下出现了两个文件,闹得沸沸扬扬.这两个一胖一瘦的家伙,偷偷的钻进了这台电脑里,不知道要干什么。“二哥,一会儿我们按计划跑,分头行动,你等我信号,拿到数据就撤。”胖子对瘦子说道。“老大,我对这里不熟,怎么等你的信号?我们得想办法沟通,等会用。”瘦子说道。“这个你不用管,师父已经交代过了。”胖子说着从背后拿出一本书《Linux进程间通信手册》翻了过来。Signal翻开说明书的第一页,上面写着:Signal—Signal,两个家伙开始认真的研究起来。过了一会儿,胖程序说:“哎呀,这不行,我们转回去吧!”瘦程序疑惑地问道:“为什么不行呢?”》看这里,手册上说信号是一种软中断通信机制,可以给指定的进程发送通知,一共有64个信号,但是这个信号只能作为通知,没办法传输数据。”“不能传输数据?那这东西有什么用?”“还是有用的啊,可以通知某个进程发生了什么,比如kill命令就是通过这个信号通知进程退出,达到杀死进程的效果。”我们翻到了手册的第二页。套接字“你看,说明书上写着可以用套接字的。”胖子说。“Socket?那不是用来网络通讯的吗?”瘦子有些疑惑。“可以,不过我们也可以用它在本地电脑上进行通讯,只需将连接的IP地址改为127.0.0.1即可。”找到了!”“不不不,说明书上说127.0.0.1是本地环回地址,数据在协议栈转发,根本不会到网卡。”“那抓包就可以了抓到我们的通信?”“那我看看……说明书上说可以在虚拟回环网卡上抓到数据lo”“算了,还是得悄悄的做,不能留下痕迹.你再看看。听瘦子这么说,胖子觉得有道理,继续翻着说明书。匿名管道“咦,有,这个叫匿名管道,听起来比较隐秘,应该不会被发现。”瘦子接过说明书看了起来。两人盯着说明书上的两张图看了半天,终于想通了。所谓匿名管道只是内核中的一个缓冲区,它提供了读写两个端口。通过fork创建子进程后,子进程继承了父进程的管道信息,只要双方同意,一读一写,就可以实现通信。“老大,这个匿名通道是单向的,我们要交流的话,需要两个通道,一个你写我读,一个我写你读。”“看起来很靠谱,就这么办吧!”,两人达成了协议。胖程序先运行,然后创建两条管道,一条用于发送消息,一条用于接收消息。然后执行fork来运行thin子例程。时间过得飞快,转眼已是深夜。随着电脑的关闭,两个家伙的进程也退出了。半夜的时候,周围没人,硬盘里的两个家伙就吵起来了。“你这是怎么了?我给你发消息不回,我连续发了一堆消息,最后管道满了,把我堵死了!”胖程序怒道。"嗨!别说了,师傅给我写的程序有bug,今天跑的时候不小心死机了,再起来的时候发现pipeline没了,怎么回事?",薄子程序说完叹了口气。“那肯定不行,这个匿名管道需要被相关的进程继承才能通信,如果换个方式运行,你肯定看不到我创建的管道!”“这个匿名管道用起来太麻烦了,看看有没有其他通讯方式?”胖程序又拿出说明书翻了翻。消息队列“是的,这里有两种写法:命名管道和消息队列”,胖程序说。“命名管道?和匿名管道有什么区别吗?”“命名管道是有名字的,有了名字,就不局限于有关系的进程,只要用这个名字,就可以打开管道进行通信,现在你就被吊死了。”重启后还能联系到我。”“那消息队列是什么?”“嗯,我看看。”“我也看看。”过了一会儿,瘦子程序说:“我明白了,这个消息队列是内核中的一个消息列表,按照消息块组织起来的,比起满是二进制数据流堆在一起的管道好用多了。”“有道理,而且这个消息还可以指定类型,这样我们就不用两个管道了,一个消息队列就可以了,而且我们使用不同的消息类型,可以省去很多麻烦!”“那我们就用消息队列吧,不用那个管道。”“好,我们开始吧!”两个家伙一拍即合,准备第二天再战。第二天,打开电脑后,他们又开始偷偷跑起来。这次使用了消息队列,这样就方便多了。共享内存不知道过了多久,瘦子的进程终于收到了一封信。胖子从消息队列中取出来,看到上面写着:“老大,数据拿到了,需要你处理,但是数据量有点大,还有管道和消息队列的传输效率太低了。有什么办法可以快速把数据发给你,希望你能尽快回来。”程程胖子大喜过望,数据拿到了,他终于可以回去工作了。可是怎么把数据快点传过来呢,我又在心里嘀咕了一句。这时,FattyProcess又拿出说明书,翻到最后一页,找到了一个叫做“共享内存”的东西,像是抓着救命稻草似的,仔细研究起来。片刻之后,胖子的脸上露出了笑容,然后他写了一条信息,发到了瘦子的进程中。但他表示,瘦进程正在焦急地等待消息。得到老大的回复,赶紧拿出来看看:二哥,楼主的手册上有提到共享内存可以用于进程间通信。我准备了几个内存页,你把它们映射到你的进程地址空间,我们可以共享这块内存,你写的数据我马上就可以看到,我写的数据你也能看到,虽然我们读的地址和write不一样,但是他们访问的其实是同一块物理内存页,效率比管道和消息队列高很多!但是,为了防止我们一起读写的时候发生冲突,我们需要配合信号量一起使用,用它来实现进程间的同步。具体使用方法如下:··································································································································································································································································然后按照大佬讲解的方法开始操作,打开分享,地图挂载一气呵成。然后,数据被一次性写入共享内存页。做完之后,他退出了流程,准备按照计划撤退,但是却没有发现胖子的踪影,既没有流程也没有文件。“这家伙是不是丢下我一个人跑了?”正想着,突然“嗡”的一声,瘦子的程序文件消失了。不过文件目录下,只有一卷《Linux进程间通信手册》...本文转载自微信公众号“编程技术宇宙”,可以通过以下二维码关注。转载本文请联系编程技术宇宙公众号。
