您的位置:首页 > 运维架构 > Linux

[Linux程序设计笔记]第12章:管道

2011-11-08 10:19 183 查看
管道:完成两个进程间的通讯(数据流)。

如shell中的: cmd1 | cmd2

1. 程序与shell(或其他程序)之间通讯:[命令可以是启动其他进程的命令]

#include <stdio.h>

FILE * popen(const char * comand, const char *open_mode);

int pclose(FILE * stream_to_close);

popen将通过命令启动一个新的进程,并能对它发送的数据进行发送或接受。open_mode必须是r或w。

pclose将关闭与之关联的文件流,pclose调用只有在popen启动的进程结束之后才能返回。

文件流的操作用fread和fwrite来完成。

示例代码:

read_fp=popen("uname -a",r);

chars_read=fread(buffer,sizeof(char),BUFFERSZIE,read_fp);

2.匿名管道:

相关进程(特别是父子进程的)通讯。使用read和write进行读写操作。

#include<unistd>

int pipe(int file_descriptor[2]);

file_desciptor[0]为读取端,file_desciptor[1]为写入端。

示例代码:

int file_descriptor[2];

data_processed=write(file_descriptor[1],some_data,strlen(some_data));

data_porcessed=read(file_descriptor[0],some_data,strlen(some_data));

如果管道中没有数据可读,read返回0。

3.命名管道:FIFO文件(一种特殊的文件)

1.创建

shell中创建: mkfifo filename

程序中创建:

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char *filename,mode_t mode);

示例代码:

int res=mkfifo("/tmp/my_fifo",0777);

2.打开

程序只能以O_RDONLY、O_WRONLY和O_NONBLOCK打开。不能读写打开。单向通道。

如:

open(const char *path,O_RDONLY);

open(const char *path,O_RDONLY | O_NONBLOCK); //其实一般用阻塞比较好,这样可以实现进程的同步

open(const char *path,O_WRONLY);

open(cosnt char *path,O_WRONLY | O_NONBOLOCK);

阻塞的时候,read要等到有数据读才解除阻塞;非阻塞没有数据读时返回0;

阻塞的时候,write等到有读取进程启动后才继续执行。

FIFO文件的长度是一个很重要的因素,系统对任一时间一个FIFO文件里能保存的数据长度有限制。在limits.h

中,PIPE_BUF。

3.读写:read和write函数。与操作普通文件相同。只是在阻塞的情况下会阻塞掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: