在计算机系统中,各个进程共享一片用户地址空间,但彼此之间是相互独立的,无法直接访问。当进程间需要进行通信时,必须通过内核空间这一共享区域进行交互。
进程间的通信方式主要包括以下几种方法:
- 管道通信:用于实现进程间的基础通信。
- 消息队列:用于在进程间传递消息。
- 共享内存:通过共享同一块内存区域实现进程间数据交换。
- 信号量:用于控制对共享资源的访问。
- 信号处理:用于处理异步事件。
- Socket通信:用于跨网络的主机间进程通信,但同样可以在同一台主机的不同进程间使用。
在Linux操作系统中,为了应对各种事件,系统定义了许多信号,我们可以通过执行'kill -l'命令查看所有可用的信号列表。
- 对于在Shell终端运行的进程,我们可以使用特定的键盘组合键来发送信号。
- 对于在后台运行的进程,我们需要知道其进程ID(PID),然后通过kill命令发送信号。
前面提到的进程间通信方式主要适用于同一台主机内的进程。若需在不同主机间的进程进行通信,就需要使用Socket。
- 在创建Socket时,需要指定协议族(如AF_INET表示IPv4,AF_INET6表示IPv6),类型(如SOCK_STREAM表示字节流,常用于TCP通信;SOCK_DGRAM表示数据报,常用于UDP通信)等。
- 对于基于TCP的Socket通信,需要经历一系列步骤:初始化Socket、绑定IP地址和端口、、等待客户端连接、建立连接后进行数据传输等。
- 基于UDP的Socket通信则无需建立连接,但仍然需要绑定IP地址和端口,并使用sendto和recvfrom等进行数据的发送和接收。
本地Socket通信也有其特点。它支持字节流和数据报两种格式的通信。对于本地字节流通信,使用的socket类型为AF_LOCAL和SOCK_STREAM;而对于本地数据报通信,则使用AF_LOCAL和SOCK_DGRAM。与跨网络主机通信不同,本地Socket通信是绑定本地的一个文件。