管道和有名管道
1.什么是管道
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在 管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据 。
数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制 机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞 。
2.管道创建
管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任 意两个进程间的通信。
无名管道由pipe ()函 数创建:
int pipe(int filedis[2]) ;
当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道,filedis[1]用于写管道 。
3.管道关闭
关闭管道只需将这两个文件描述符关闭即可,可以使用普通的close函数逐个关闭 。
#include
#include
#include
#include
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n"); return -1;
}
else
printf("pipe create success\n");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
4.管道读写
管道用于不同进程间通信。通常先创建一个管道,再通过fork 函数创建一个子进程,该子进程 会继承父进程所创建的管道 。
注意事项:
必须在系统调用fork( )前调用pipe( ),否则子进程将不会继承文件描述符 。
5.命名管道(FIFO)
命名管道和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用;但是通过命名管道,不相关 的进程也能交换数据 。
5.1创建:
#include
#include
int mkfifo(const char * pathname, mode_t mode)
pathname : FIFO 文 件 名
mode : 属性(见文件操作章节)
一旦创建了一个FIFO ,就可用open打开它 ,一般的文件访问函数(close 、 read 、 write 等)都可用 于FIFO 。
5.2操作:
当打开FIFO时,非阻塞标志(O_NONBLOCK)将对以后的读写产生如下影响 :
1、没有使用O_NONBLOCK :访问要求 无法满足时进程将阻塞。如试图读取空的FIFO,将导致进程阻塞 。
2、使用O_NONBLOCK :访问要求无法满足时不阻塞 ,立刻出错返回,errno是ENXIO 。
阅读(1461) | 评论(0) | 转发(0) |