有名管道在内存中开辟一块新的空间,2个进程通过文件描述符操作这片空间,可以再任意两个进程间传递数据。仅仅是目 录树中的一个标示, 并不在磁盘上空间。
那么如何创建一个管道文件,有2个方式,一个使用mkfifo命令创建另一个是在程序中用mkfifo()函数创建。
如何使用管道文件,和普通文件一样,使用open,read,write,close函数操作。
但是和其他文件不同,主要有以下四点。
1.如果一个进程以只写打开管道, 但是没有以只读或读写打开这个管道的进程, 则打开操作会阻塞, 直到有进程以读或读写打开, open 才会返回。
2.如果一个进程以只读打开管道, 但是没有以只写或读写打开这个管道的进程, 则打开操作会阻塞, 直到有进程以写或读写打开, open 才会返回。
3.当写端没有写入数据时, 读端会阻塞到 read 调用, 直到写端写入数据或者写端关闭。
4.当管道没有空间时, 再写入数据就会被阻塞。 直到有进程读取数据, 或者所有的读端关闭。
那么下面是例子,A程序接受用户输入的字符串,以end结束,之后传递给B程序,B程序计算一共有多少字符,end不计数。
这个是A程序。
#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
void main()
{
char cmd[1024] = {0};
char p[] = "end";
while(strstr(cmd,p) ==0)
{
gets(cmd);
}
int fw = open("./FIFO",O_WRONLY);
printf("open sucess\n");
write(fw,&cmd,strlen(cmd));
printf("write sucess\n");
close(fw);
}
这个是B程序
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
// read
//
void main()
{
int fd = open("FIFO",O_RDONLY);
int count = 0;
char buf[1024] = {0};
read(fd,buf,1024);
printf("%d\n",strlen(buf)-3);
close(fd);
}