当前位置:
文档之家› (5)Linux c++进程间通信-30页文档资料
(5)Linux c++进程间通信-30页文档资料
时则返 定义函数int close(int fd);
数的返回值为0表示成功,-1表示失败。当函数成功返回,则自动维 护了一个从Fd[1]到Fd[0]的数据管道。
Fd[0]
用户进程
Fd[1]
写
读
内核
进无程名A管道
无名管道通的创建与关闭
管道是基于文件描述符的,当一个管道建立时他会创建两 个文件描述符fd[0]是读出端, fd[1]是写入端,管道关闭 时逐个关闭各个文件描述符即可,也可以使用close函数逐 个关闭各个文件描述符即可。
有名管道:FIFO是对无名管道的改进,他可以使互补相关 的两个进程实现彼此的通信。该管道可以通过路劲来指出, 并且在文件系统中是可见的,在建立了管道后两个进程就 可以把它当做普通文件一样进行读写。使用方便。FIFO严 格的遵循先进先出规则,对管道及FIFO的读写总是从开始 处返回数据,对他们的写操作则吧数据添加到末尾,他们 不支持lseek()等文件定位操作。
信号灯等
数据流
进程B
Linux进程间通信是独立的并不能相互访问对方,linux/unix系统提供 了一种中间转发的机制,为多个进程建立起相互通信的数 据通道。
进程A 进程A
内存
进程A
进程B 进程B 进程B
Linux进程IPC的多种方式
管道通信方式:半双工管道、匿名半双工管道FIFO、、全 双工管道、匿名全双工管道、命名全双工管道。管道可以 用于具有亲缘关系进程间的通信。命名管道还可以使用无 亲缘关系的进程间通信。
System V IPC/POSIX IPC:消息队列、信号量、共享存储。 信号是在软件层次上对终端机制的一种模拟,它是比较复 杂的通信方式。用于通知进程有某事件发生,一个进程接 受到一个信号与处理器收到一个中断请求效果上可以说是 一样的。
Linux进程管道通信
进程A 父进程
进程B 子进程
内核 无进名程管A道
进程A
进程B
文件系统 有进名程管A道
无名管道通信
无名管道是一种半双工的管道,他是进程的一种资源,会随着进程 的结束而被系统清除,数据在无名管道内只能沿一个方向移动。
使用pipe函数创建一个无名管道函数原型如下: #include<unistd.h> Int pipe(int fd[2]); Fd[2]是一个长度为2的数组, fd[0]是读出端, fd[1]是写入端,函
第五讲 Linux 进程间通信
Linux进程间通信
进程是一个程序一次执行,系统资源分配的最小单元,这 里所说的进程一般是指与运行在用户的进程,而处于用户 态的不同进程之间是彼此隔离的,就像处于不同城市的人 们,他们必须通过某种方式来进程通信,例如人们使用手 机一样。
一个大型的应用系统,往往需要很多的进程协作,进程间 通信的重要性显而易见,进程间通信IPC(interprocess communication)是在liunx/unix下编程中常用的问题,他的 实际意义在与怎么让多个进程相互访问数据。在liunx中可 以由多种方式来实现上述问题。
创建管道使用pipe函数,用pipe函数创建的管道两端位于 一个进程中,没有意义,实际使用中是先用pipe建立一个 管道,再使用fork函数创建一个子进程,应为连个进程拥 有统一管道,则如下图所示。
父进程
Fd[0]
Fd[1]
内核 无名进管程道A
子进程
Fd[0]
Fd[1]
无名管道通的创建与关闭
上图看似复杂实际上为进程间通信创造了良好的条件,父 子进程分别拥有自己的读写通道,为了实现父子进程之间 的读写,只需要把无关的读写端关闭即可。如下图所示。 这样就建立了一条“子进程写父进程读”的管道。同样也 可以建立一条“父进程写子进程读”的管道。
Linux守护进程
Linux守护进程
write(将数据写入已打开的文件内) 定义函数ssize_t write (int fd,const void * buf,size_t count); 函数说明write()会把参数buf所指的内存写入count个字节到参数fd
所指的文 件内。当然,文件读写位置也会随之移动。 返回值如果顺利write()会返回实际写入的字节数。当有错误发生
此外父进程可以建立多个子进程,相互的子进程(兄弟进程) 也可以建立管道。
父进程
关
Fd[0]
Fd[1] 闭
关
子进程
闭 Fd[0]
Fd[1]
内核 无名进管程道A
Linux管道建立注意事项
只有在管道的读端存在时写端写入的数据才有意义,否则 向管道写入的数据将受到内核传来的SIGPIPE信号。
向管道写入数据时,linux将不保证写入的原子性,管道的 缓冲区一有空闲区域,写进程就会试图向管道写入数据, 如果读写进程不读取管道缓冲区的数据,那么写操作将一 直阻塞,
Linux进程间通信
进程间通信就是可以让多个进程相互访问,这种访问包括程 序运行时的实时数据,也包括对方的代码段,这是在实际应用中 及其常见的问题。
下图中,所示进程间通信的模式,进程A和进程B会在运行的 过程中需要一些额外的数据,IPC为两个进程提供了一种数据传输 通道。
进程A
数据流
IPC (Interprocess communicaiont) 管道、FIFO 共享内存、
消息队列:消息队列是消息的链表,包括POSIX消息队列 网络进程间通信:SOCKET STREAMS,套接字,这是一种
更为一般的进程间通信机制,它可以用在网络中不通机器 之间的进程通行。
Linux进程管道通信
管道是linux中一种重要的通信方式,它把一个程序的输出 直接连接到另一程序的输入,linux的管道主要包括两种, 无名管道和有名管道。
无名管道是liunx中管道通信的一种原始方法,他具有如下 特点:只能用于有亲缘关系的进程之间通信(父子和兄弟进 程间);他是一个半双工的通信方式,具有固定的读端和写 端;管道可以看成一种特殊的文件,对于他的读写也可以 使用普通的read()write()等函数,但是他不是普通的文件, 并不属于任何文件系统,并且只存在于内存中。