进程间通信概述
进程间通信(IPC:Inter Processes Communication)
进程是一个独立的资源分配单元
不同进程(这里进程指用户进程) 之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源(例如打开的文件描述符)
进程不是孤立的, 不同的进程需要进行信息的交互和状态的传递等, 因此需要进程间通信
进程间通信功能:
数据传输:
一个进程需要将它的数据发送给另一个进程
资源共享:
多个进程之间共享同样的资源
通知事件:
一个进程需要向另一个或一组进程发送消息, 通知它们发生了某种事件
进程控制:
有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制进程希望能够拦截另一个进程的
所有操作,并能够及时知道它的状态改变
linux 进程间通信(IPC)由以下几个部分发展而来
最初的 UNIX 进程间通信
SYSTEM V 进程间通信
POSIX进程间通信(POSIX:Portable Operating System interface 可移植操作系统接口)
Socket 进程间通信
Linux 把优势都继承了下来并形成了自己的 IPC
Linux 操作系统支持的主要进程间通信的通信机制
信号概述
信号是软件中断, 它是在软件层次上对中断机制的一种模拟
信号可导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件
信号是一种异步通信方式
进程不必等待信号的到达, 进程也不知道信号什么时候到达
信号可直接让用户空间进程和内核空间进程的交互, 内核进程可利用它来通知 用户空间进程 发生了哪些系统事件
每个信号的名字都以字符 SIG 开头
每个信号和一个数字编码相对应, 在头文件 sig*.h 中, 这些信号都被定义为正整数
// 查看这些信号和编码的对应关系
kill -l
以下条件可以产生一个信号
当用户按某些终端键时, 将产生信号
如:
终端上按“Ctrl+c” 组合键通常产生中断信号 SIGINT
终端上按"Ctrl+\"键通常产生中断信号 SIGQUIT
终端上按"Ctrl+z"键通常产生中断信号 SIGSTOP
硬件异常将产生信号
除数为 0,无效的内存访问
这些情况通常由硬件检测到, 并通知内核,然后内核产生适当的信号发送给相应的进程
软件异常将产生信号
当检测到某种软件条件已发生, 并将其通知有关进程时, 产生信号
调用 kill 函数将发送信号
注意: 接收信号进程和发送信号进程的所有者必须相同, 或发送信号进程的所有者必须是超级用户
运行 kill 命令将发送信号
此程序实际上是使用 kill 函数来发送信号
也常用此命令终止一个失控的后台进程
一个进程收到一个信号的时候,可以用如下方法进行处理:
执行系统默认动作
终止该进程
忽略此信号
接收到此信号后没有任何动作
执行自定义信号处理函数
用户定义的信号处理函数处理该信号
注意:
SIGKILL 和 SIGSTOP 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法