linux系统内核提供了进程间通信的机制
- IPC(InterProcess Communication)
IPC的目的
- 数据传输
- 数据共享
- 通知事件
- 资源共享
- 进程控制
IPC分类, 有多种,如下只是其中2~3种
- 信号
- 管道
- 传统的Unix System V的IPC机制
信号
- 信号主要是用来通知进程异步事件的发生.最初信号设计的目的就是为了处理错误,他们也用来作为最基本的IPC机制. 在linux中可以识别64种不同的信号.这些大部分都有预先定义好的意义, 但是至少有两个: SIGUSR1 和 SIGUSR2 可以由应用程序来定义.
- 进程可以显式的用kill 或者 killpg系统函数来向另一个进程或者进程组发出信号. 此外,内核可以响应不同的事件而产生内部信号. 每一个信号都有一个默认的动作, 典型的默认动作就是终止进程.
- 进程可以通过提供信号处理函数来取代对于任意信号的默认反应,信号发生时, 内核中断当前进程,进程执行处理函数来响应信号,信号处理完成后,进程恢复正常的处理. 这就是事件通知进程和进程响应异步事件的方式.
- 信号也可以用来同步,进程可以调用sigpause以等待信号的到来.
- 信号的局限性在于信号的系统开销太大,而且信号的数量非常有限,且信号能传递的信息量有限,用户产生的信号不能发送附加信息以及各种参数,信号对应事件通知很有用,但是对于复杂的交互操作,信号不能胜任.
- 系统中预定义的信号,可以使用 kill -l命令显示系统中的信号
- 进程可以忽略大部分信号,但是有2个是不能忽略的,除了这两个信号,其他的信号都可以被阻塞不被处理
- SIGSTOP : 这个信号将中断进程的执行.
- SIGKILL : 这个信号将强制进程退出.
- 为了让进程处理信号,Linux必须维护进程如何处理信号的信息,这些信息保存在一个sigaction数据结构中.通过改变sigaction结构可以改变对进程对信号的默认处理方式.
- 实际上,只有内核和超级用户有发送信号到其他进程的权限.普通进程只能向那些有相同UID和GID的进程发送信号,或者向那些在一个进程组中的进程发送信号.
- 信号在产生后并不是立即发送给进程的,它必须等到进程再次运行时才能发送.每当进程从系统调用中返回时,系统就检查进程的task_struct结构,如果有任何非阻塞的信号,那就就发送这个信号.进程也可以等待特定的信号,在信号出现之前,进程处于挂起状态.
- 如果一个信号处理程序被设置为默认的动作, 那么内核会处理这个信号.
- 除了默认的信号处理以外,进程也可以指定一个自己的信号处理程序,这才是编程需要处理的问题.
- Linux使用了堆栈来管理要执行的信号处理程序.这样当一个信号处理程序完成操作时,下一个将被调用.