• 管道和命名管道


    命名管道(named PIPE)

    由于基于fork机制,所以管道只能用于父进程和子进程之间,或者拥有相同祖先的两个子进程之间 (有亲缘关系的进程之间)。为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。

    FIFO (First in, First out)为一种特殊的文件类型,它在文件系统中有对应的路径。当一个进程以读(r)的方式打开该文件,而另一个进程以写(w)的方式打开该文件,那么内核就会在这两个进程之间建立管道,所以FIFO实际上也由内核管理,不与硬盘打交道。之所以叫FIFO,是因为管道本质上是一个先进先出的队列数据结构,最早放入的数据被最先读出来,从而保证信息交流的顺序。FIFO只是借用了文件系统(file system,命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。)来为管道命名。写模式的进程向FIFO文件中写入,而读模式的进程从FIFO文件中读出。当删除FIFO文件时,管道连接也随之消失。FIFO的好处在于我们可以通过文件的路径来识别管道,从而让没有亲缘关系的进程之间建立连接

    函数原型:

    #include <sys/types.h>
    #include <sys/stat.h>
    
    int mkfifo(const char *filename, mode_t mode);
    int mknode(const char *filename, mode_t mode | S_IFIFO, (dev_t) 0 );

    其中pathname是被创建的文件名称,mode表示将在该文件上设置的权限位和将被创建的文件类型(在此情况下为S_IFIFO),dev是当创建设备特殊文件时使用的一个值。因此,对于先进先出文件它的值为0。

    #include<sys/types.h>
    #include<sys/stat.h>
    #include<unistd.h>
    #include<fcntl.h>
    int main(void)
    {
        char buf[80];
        int fd;
        unlink("zieckey_fifo");
        mkfifo("zieckey_fifo",0777);
        if(fork()>0)
        {
            char s[]="Hello!
    ";
            fd=open("zieckey_fifo",O_WRONLY);
            write(fd,s,sizeof(s));
            //close(fd);
        }
        else
        {
            fd=open("zieckey_fifo",O_RDONLY);
            read(fd,buf,sizeof(buf));
            printf("Themessagefromthepipeis:%s
    ",buf);
            //close(fd);
        }
        return  0;
    }
    /*执行结果为
    Themessagefromthepipeis:Hello!
    并且可以在程序执行目录生成管道文件zieckey_fifo
    */
                                  

    注意:ls命令的输出结果中的第一个字符为p,表示这是一个管道。最后的|符号是由ls命令的-F选项添加的,它也表示是这是一个管道。

    FIFO读写规则

    1.从FIFO中读取数据: 约定:如果一个进程为了从FIFO中读取数据而阻塞打开了FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作

    2.从FIFO中写入数据: 约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。

    详见:http://blog.csdn.net/MONKEY_D_MENG/article/details/5570468

  • 相关阅读:
    收藏:iBLC编码器
    蛙蛙推荐:怎样调试asp.net黄页错
    蛙蛙推荐:IE下3px bug研究
    蛙蛙推荐:winform入门
    蛙蛙推荐:蛙蛙牌云存储服务
    整理:个人知识管理相关链接
    蛙蛙推荐:c#编写网络电话
    蛙蛙推荐:蛙蛙教你解析网络包
    有用的SQL 语句(转) dodo
    .net 点击刷新验证码问题 dodo
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4381510.html
Copyright © 2020-2023  润新知