【面试准备】操作系统
-
- 进程间通信 IPC (InterProcess Communication)
- 2.1. 管道 pipe
- 2.1.1. 管道/匿名管道 anonymous pipe * 2.2. 套接字 Sokcet
- 进程间通信 IPC (InterProcess Communication)
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。
这里可以看到我们需要做的事