首页 > 代码库 > 进程间通信(IPC)

进程间通信(IPC)

概述

1、Linux使用的进程间通信方式主要包括:

(1)管道(pipe)和有名管道  (2)信号(signal)  (3)共享内存   (4)消息队列  (5)信号量  (6)套接字(socket)

2、问:为什么进程间需要通信?

(1)数据传输  一个进程需要将它的数据发送给另外一个进程

(2)资源共享  多个进程间共享同样的资源

(3)通知事件  一个进程需要向另外一个或一组进程发送消息,通知它们发生了某种事件

(4)进程控制  某些进程希望能够控制另一个进程的执行(比如Debug进程),此时,控制进程希望能够拦截另外一个进程的所有操作,并且能够及时知道它的状态改变。

 3、Linux进程间通信由以下几部分发展以来:

(1)UNIX进程间通信  (2)基于System V 进程间通信  (3)POSIX进程间通信

一、管道通讯

管道:单向的、先进先出的,它将一个进程的输出和另一个进程的输入连接在一起。写进程在管道的尾部写入数据,读进程在管道的头部读取数据。

注: 数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将堵塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。】

分类:无名管道  用于父、子进程间的通信;

        命名管道  用于运行于同一系统中的任意两个进程间的通信。

 (1)无名管道  由pipe()函数创建:

1 #include <unistd.h>2 int pipe(int filedis[2]);

 

当一个管道建立时,它会建立两个文件描述符,存放在filedis数组中:filedis[0]用于读管道,filedis[1]用于写管道。  返回值:成功,返回0;失败,返回-1,并设置errno。

管道的关闭:关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭。

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

 

 1  //创建管道 2  #include <unistd.h> 3  #include <errno.h> 4  #include <stdio.h> 5  #include <stdlib.h> 6   7  int main() 8  { 9      int pipe_fd[2];10      if(pipe(pipe_fd) < 0)11      {12          printf("pipe create error.\n");13          return -1;14      }15      else 16          printf("pipe create success.\n");17  18      close(pipe_fd[0]);19      close(pipe_fd[1]);20      return 0;21  }
创建管道

 

 

 

 

二、信号通讯

 

三、共享内存通讯

 

进程间通信(IPC)