概述
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 }
创建管道