路漫漫其修远兮,吾将上下而求索!
分类: 嵌入式
2015-05-26 13:20:19
声明:该篇博文是作者在学习嵌入式过程中整理的。
参考书籍以及相关资料:《Advanced Programming in the UNIX Environment》、《LINUX C编程从初学到精通》http://blog.csdn.net/ljianhui/article/details/10202699。
一 .管道用于进程(区别于线程)间通信,多个进程间的数据传输,可以用管道来完成.管道是一个进程连接数据流到另一个进程的通道.他通常是用作把一个进程的输出通过管道连接到另一个进程的输入.
匿名管道无法处理不相关进程之间的通信,但是命名管道可以.命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和匿名管道类似.由于Linux中所有的事物都可视为文件,所以对命名管道的使用也就变的与文件操作非常统一
二. 优缺点了解:
三.组织结构
头文件: #include
#include
创建 name pipe : mkfifo(const char* pathname,mode_t mode);
pathname :要创建的文件名,包含路径,该文件其实就是创建的name pipe。
mode: 指定文件的读写权限。
return : 0 创建成功
>0 创建失败
mknod(const char *pathname,mode_t mode | S_IFIFO,(dev_t)0)
mknod 和mkfifo 的函数功能一样,mkfifo 是新函数。
Open name pipe: open(const char *path,O_RDONLY,...)
open(const char *path,O_RDONLY|O_NONBLOCK,...)
open(const char *path,O_WRONLY,...)
open(const char *path,O_WRONLY|O_NONBLOCK,...)
FIFO文件可以使用open调用来打开,常用的有上面4中方式。需要注意的有两点1:程序不能以O_RDWR模式打开name pipe 进行读写操作,因为如一个管道以读、写方式打开,进程就会读回自己的输出,同时我们通常使用FIFO只是为了单向数据传递。2、传递给open调用的是FIFO的路径,而不是正常的文件。
O_RDONLY: only read
O_WRONLY: only write
... :第三个参数是文件的权限设置.
O_NONBLOCK: 以不可阻断的方式打开文件,也就是无论有无数据 读取或者等待, 都会立刻返回到进程中.
四 、简单的测试代码(学习嵌入式过重中用于练习的一个简单的习题)
编写两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并且在写管道程序中main函数的参数作为写入管道中的内容。读管道读出用户写入管道的内容。
fifo_read.c:
#include
#include
#include
#include
#include
#include
void main(int args,char**argv)
{
const char* fifo = "Rdfifo";
int err;
int pd_fifo;
char buff[120];
int size;
err = mkfifo(fifo,0777);
if(err!=0)
{
fprintf(stderr,"Could not create fifo %s\n",fifo);
exit(EXIT_FAILURE);
}
printf("read:\t");
pd_fifo = open(fifo,O_RDONLY,0755);
if(pd_fifo ==-1)
{
fprintf(stderr,"Could not open fifo %s",fifo);
exit(EXIT_FAILURE);
}
size = read(pd_fifo,buff,sizeof(buff));
close(pd_fifo);
printf("%s\n",buff);
}
fifo_write.c
#include
#include
#include
#include
#include
#include
const char* fifo = "Rdfifo";
void main(int argc,char **argv)
{
int pd;
pd = open(fifo,O_WRONLY|O_NONBLOCK,0);
if(pd==-1)
{
fprintf(stderr,"Could not open fifo %s\n",fifo);
exit(EXIT_FAILURE);
}
fprintf(stderr,"write: %s\n",(argv[1]));
write(pd,argv[1],sizeof(argv[1]));
close(pd);
}
运行结果
打开一个终端,分别运行如下命令
$gcc fifo_write -o write
$gcc fifo_read -o read
运行完上述两个,再打开一个终端,一个终端 执行 ./read 另一个终端执行 ./write snow 观察read。
五、总结
注意阻塞的运用(N_NONBLOCK)。