linux管道fifo,Linux管道(具名FIFO)

概述

(匿名)管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。

如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道;命名管道是一种特殊类型的文件.

管道应用

1)创建一个命名管道

命名管道可以从命令行上创建:

$ mkfifo

命名管道在程序里创建:#include

#include

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

匿名管道 VS. 命名管道

1)匿名管道由pipe函数创建并打开。

命名管道由mkfifo函数创建,打开用open

2)FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

命名管道的打开规则

1)读打开FIFO

O_NONBLOCKdisable(阻塞):阻塞直到有相应进程为写而打开该FIFO

O_NONBLOCK enable(非阻塞):立刻返回成功

2)写打开FIFO

O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO

O_NONBLOCK enable:立刻返回失败,错误码为ENXIO

命名管道的读写规则

同匿名管道

FIFO编程实践

/**说明:利用管道,两个进程间进行文件复制。

进程writefifo:

读input.txt文件

写入管道fifo

进程readfifo:

读管道fifo

写入output.txt文件

*/

//1:writefifo

//write fifo, read from file

int main()

{

//创建FIFO

if (mkfifo("./myFifo",0644) == -1)

{

err_exit("mkfifo error");

}

//打开管道

int fifofd = open("./myFifo",O_WRONLY);

if (fifofd == -1)

{

err_exit("open fifo error");

}

//打开文件

int filefd = open("./input.txt",O_RDONLY);

if (filefd == -1)

{

err_exit("open file error");

}

//const int BUFSIZ = 1024;

char buf[BUFSIZ];

int readCount = 0;

while ((readCount = read(filefd,buf,BUFSIZ)) > 0)

{

write(fifofd,buf,readCount);

}

close(fifofd);

close(filefd);

cout << "Write FIFO OK..." << endl;

return 0;

}

//2:readfifo

//read fifo, write to file

int main()

{

//打开FIFO

int fifofd = open("./myFifo",O_RDONLY);

if (fifofd == -1)

{

err_exit("open fifo error");

}

//打开文件

int filefd = open("./output.txt",O_WRONLY|O_CREAT,0644);

if (filefd == -1)

{

err_exit("open file error");

}

char buf[BUFSIZ];

int readCount = 0;

while ((readCount = read(fifofd,buf,BUFSIZ)) > 0)

{

write(filefd,buf,readCount);

}

close(fifofd);

close(filefd);

cout << "Read FIFO OK..." << endl;

return 0;

}

附-FIFO手册页(man 3 mkfifo)MKFIFO(3) Linux Programmer's Manual MKFIFO(3)

NAME

mkfifo - make a FIFO special file (a named pipe)

SYNOPSIS

#include

#include

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

DESCRIPTION

mkfifo() makes a FIFO special file with name pathname. mode specifies the FIFO's permissions. It is modified by the process's umask in the usual way: the permissions of the created file are (mode & ~umask).

A FIFO special file is similar to a pipe, except that it is created in a different way.

Instead of being an anonymous communications channel, a FIFO special file is entered into the filesystem by calling mkfifo().

Once you have created a FIFO special file in this way, any process can open it for reading or writing, in the same way as an ordinary file. However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it.

Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa. See fifo(7) for nonblocking handling of FIFO special files.

RETURN VALUE

On success mkfifo() returns 0. In the case of an error, -1 is returned (in which case, errno is set appropriately).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值