进程间通信----管道

来源:互联网 发布:mac下载不了软件 编辑:程序博客网 时间:2024/06/15 01:39

进程间通信,又称为IPC,包含以下类型

半双工管道FIFO

全双工管道

消息队列

信号

信号量

共享内存

套接字socket

streams。。

一,管道是UNIX系统IPC的最古老形式,他具有两种局限性

1、数据只能在一个方向上流动

2、只能在具有公共祖先的进程之间使用。一个管道由一个进程创建,然后该进程调用fork,

此后父、子进程之间就可应用该管道。

管道叫pipe,而有名管道叫FIFO。

pipe,无名管道只能父子进程间通信

有名管道FIFO能在系统中的任意两个进程间通信

管道的创建方式:

#include <unistd.h>

int pipe(int filedes[2]);

filedes 文件描述符

filedes[0]用于读管道, filedes[1]用于写管道.


 关闭管道只需要关闭两个文件描述符即可,可以使用close函数。


父子进程通信


创建管道钱先调用pipe,否则子进程不会继承文件描述符。

另外要注意的是, 调用fork之后做什么取决于我们的数据流的方向, 对于父进程到子进程

的管道, 父进程关闭管道的读端 fd[0], 子进程关闭管道的写端fd[1]。 


当读一个写端已经被关闭的管道时, 所有数据被读取之后, read函数调用后将返回0,。

当写一个读端已经被关闭的管道, 则会产生信号SIGPIPE, write返回-1, errno设置为EPIPE

在写管道的时候, 管道缓冲区的大小由 PIPE_BUF决定。用pathconf活则会fpathconf函数可以确定PIPE_BUF的值


二、创建有命名管道

#include  <sys/types.h>

#include <sys/stat.h>


int mkfifo(const char *pathname, mode_t mode)

pathname : FIFO文件名

mode : 创建属性


0 0