1. 前言 introduction

好像很多讲 IPC 的东西都只介绍个大概,还是会让人一知半解。这里尽量以实例来说明……就好理解了。

2. 进程间通信 IPC (InterProcess Communication)

2.1. 管道 pipe

2.1.1. 管道/匿名管道 anonymous pipe

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。

    半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。

  • 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

太长不看。 (废话真多)直接给例子

命令行

ifconfig | grep 192.168

Julia

using JSON
"hello" |> json |> println
# 等同于
println(json("hello"))

一句话不说是最好的。

2.2. 套接字 Sokcet

没错,我就是要把这个放第二位讲。为什么,因为真用过啊。

PyCharm 的专业版有一个功能(虽然专业版不开放 Java 部分的源码,但是下面的 .py 文件开源),把 matplotlib 输出的图像直接重定向到 sci-view 的 panel 上。 用到的就是 socket

这里截取部分代码:

import socket
import struct

# 在类中,省略掉一段缩进

buffer = self.tostring_rgb()
render = self.get_renderer()
width = int(render.width) # 图像宽度
plot_index = index if os.getenv("PYCHARM_MATPLOTLIB_INTERACTIVE", False) else -1

try:
    sock = socket.socket()
    sock.connect((HOST, PORT))
    sock.send(struct.pack('>i', width))
    sock.send(struct.pack('>i', plot_index))
    sock.send(struct.pack('>i', len(buffer)))
    sock.send(buffer)
except OSError as _:
    pass

server 端的代码用 Java 写的,接收包装起来的数据:图像宽度,图像序号,图像大小,图像内容(tostring_rgb)。然后处理变回图像,输出到 panel。 这里可以看到我们需要做的事