Linux 进程间通信1

来源:互联网 发布:美股数据下载 编辑:程序博客网 时间:2024/06/03 04:33

一、进程间通信概述

         进程间通信:在用户空间实现进程通信是不可能的,通过Linux内核通信

       1.数据传输 : 一个进程需要将它的数据发送给另一个进程
       2.资源共享 :多个进程之间共享同样的资源
       3.通知事件 :一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件
       4.进程控制 :有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变

二、现在Linux使用的进程间通信方式包括:
       1、管道(pipe)和有名管道(FIFO)
       2、信号(signal)
       3、消息队列
       4、共享内存
       5、信号灯
       6、套接字(socket)

三、管道通信

     1、管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。

     2、文件io中的open函数不能创建管道文件,只能用pipe函数来创建管道。

     3、无名管道创建:int pipe(int filedis[2]);
           当一个管道建立时,它会创建两个文件描述符:
           filedis[0] 用于读管道,
           filedis[1] 用于写管道

    4、 管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道

    5、必须在系统调用fork( )前调用pipe( ),否则子进程将不会继承文件描述符

    6、命名管道和无名管道基本相同,但也有不同点:
 无名管道只能由父子进程使用;
 但是通过命名管道,不相关的进程也能交换数据

   7、int mkfifo(const char * pathname, mode_t mode)
         pathname:FIFO文件名
         mode:属性(见文件操作章节)
         一旦创建了一个FIFO,就可用open打开它,一般的文件访问函数(close、read、write等)都可用于FIFO

四、信号通信

    1、信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
 1、当用户按某些按键时,产生信号
 2、硬件异常产生信号:除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效                 存储区的进程产生一个SIGSEGV信号
          3、进程用kill函数将信号发送给另一个进程
          4、用户可用kill命令将信号发送给其他进程

   2、SIGKILL\SIGSTOP。
         这两种信号不能被忽略的原因是:
 它们向超级用户提供了一种终止或停止进程的方法

   3、执行用户希望的动作
 通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理


   4、  执行系统默认动作

  对大多数信号的系统默认动作是终止该进程
   5、使用alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号.如果不捕捉此信号,则默认动作是终止该进程
   6、pause函数使调用进程挂起直至捕捉到一个信号。
#include <unistd.h>
int pause(void)
                        只有执行了一个信号处理函数后,挂起才结束

   7、1、SIG_IGN:忽略此信号
         2、SIG_DFL: 按系统默认方式处理
         3、信号处理函数名:使用该函数处理

原创粉丝点击