Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101554
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-30 12:58
个人简介

路漫漫其修远兮,吾将上下而求索!

文章分类

全部博文(21)

文章存档

2016年(3)

2015年(18)

我的朋友

分类: 嵌入式

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)。


 












































阅读(1818) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Cadence Allegro 通孔焊盘制作

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