全方位剖析 Linux 操作系统,太全了( 五 )


全方位剖析 Linux 操作系统,太全了

文章插图
 
Linux 进程间通信Linux 进程间的通信机制通常被称为 Internel-Process communication,IPC下面我们来说一说 Linux 进程间通信的机制,大致来说,Linux 进程间的通信机制可以分为 6 种
全方位剖析 Linux 操作系统,太全了

文章插图
 
下面我们分别对其进行概述
信号 signal信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送异步事件信号来实现,信号可以从键盘或者访问不存在的位置等地方产生;信号通过 shell 将任务发送给子进程 。
你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号
全方位剖析 Linux 操作系统,太全了

文章插图
 
进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号 。SIGSTOP 信号会通知当前正在运行的进程执行关闭操作,SIGKILL 信号会通知当前进程应该被杀死 。除此之外,进程可以选择它想要处理的信号,进程也可以选择阻止信号,如果不阻止,可以选择自行处理,也可以选择进行内核处理 。如果选择交给内核进行处理,那么就执行默认处理 。
操作系统会中断目标程序的进程来向其发送信号、在任何非原子指令中,执行都可以中断,如果进程已经注册了新号处理程序,那么就执行进程,如果没有注册,将采用默认处理的方式 。
例如:当进程收到 SIGFPE 浮点异常的信号后,默认操作是对其进行 dump(转储)和退出 。信号没有优先级的说法 。如果同时为某个进程产生了两个信号,则可以将它们呈现给进程或者以任意的顺序进行处理 。
下面我们就来看一下这些信号是干什么用的
  • SIGABRT 和 SIGIOT
SIGABRT 和 SIGIOT 信号发送给进程,告诉其进行终止,这个 信号通常在调用 C标准库的abort()函数时由进程本身启动
  • SIGALRM 、 SIGVTALRM、SIGPROF
当设置的时钟功能超时时会将 SIGALRM 、 SIGVTALRM、SIGPROF 发送给进程 。当实际时间或时钟时间超时时,发送 SIGALRM 。当进程使用的 CPU 时间超时时,将发送 SIGVTALRM 。当进程和系统代表进程使用的CPU 时间超时时,将发送 SIGPROF 。
  • SIGBUS
【全方位剖析 Linux 操作系统,太全了】SIGBUS 将造成总线中断错误时发送给进程
  • SIGCHLD
当子进程终止、被中断或者被中断恢复,将 SIGCHLD 发送给进程 。此信号的一种常见用法是指示操作系统在子进程终止后清除其使用的资源 。
  • SIGCONT
SIGCONT 信号指示操作系统继续执行先前由 SIGSTOP 或 SIGTSTP 信号暂停的进程 。该信号的一个重要用途是在 Unix shell 中的作业控制中 。
  • SIGFPE
SIGFPE 信号在执行错误的算术运算(例如除以零)时将被发送到进程 。
  • SIGUP
当 SIGUP 信号控制的终端关闭时,会发送给进程 。许多守护程序将重新加载其配置文件并重新打开其日志文件,而不是在收到此信号时退出 。
  • SIGILL
SIGILL 信号在尝试执行非法、格式错误、未知或者特权指令时发出
  • SIGINT
当用户希望中断进程时,操作系统会向进程发送 SIGINT 信号 。用户输入 ctrl - c 就是希望中断进程 。
  • SIGKILL
SIGKILL 信号发送到进程以使其马上进行终止 。与 SIGTERM 和 SIGINT 相比,这个信号无法捕获和忽略执行,并且进程在接收到此信号后无法执行任何清理操作,下面是一些例外情况
僵尸进程无法杀死,因为僵尸进程已经死了,它在等待父进程对其进行捕获
处于阻塞状态的进程只有再次唤醒后才会被 kill 掉
init 进程是 Linux 的初始化进程,这个进程会忽略任何信号 。
SIGKILL 通常是作为最后杀死进程的信号、它通常作用于 SIGTERM 没有响应时发送给进程 。
  • SIGPIPE
SIGPIPE 尝试写入进程管道时发现管道未连接无法写入时发送到进程
  • SIGPOLL
当在明确监视的文件描述符上发生事件时,将发送 SIGPOLL 信号 。
  • SIGRTMIN 至 SIGRTMAX
SIGRTMIN 至 SIGRTMAX 是实时信号
  • SIGQUIT
当用户请求退出进程并执行核心转储时,SIGQUIT 信号将由其控制终端发送给进程 。
  • SIGSEGV
当 SIGSEGV 信号做出无效的虚拟内存引用或分段错误时,即在执行分段违规时,将其发送到进程 。


推荐阅读