进程间通信概述

     进程间通信(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 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法