Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260619
  • 博文数量: 78
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-20 11:11
文章存档

2012年(78)

我的朋友

分类: LINUX

2012-03-20 20:04:16

管道和有名管道
 
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) |
0

上一篇:2.进程控制

下一篇:4.多线程

给主人留下些什么吧!~~