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