zoukankan      html  css  js  c++  java
  • 有名管道

    有名管道(FIFO)。
    有名管道是持久稳定的。
    它们存在于文件系统中。
    FIFO比无名管道作用更大,因为它们能让无关联的进程之间交换数据。
    一个shell命令可以建立有名管道
    mkfifo [option] name
    mkfifo创建一个名为name的有名管道
     
     
    mkfifo fifo1。
      –创建一个有名管道fifo1。
    cat < fifo1。
      –通过cat命令从fifo1中读取数据。
    ls > fifo1。
      –将ls命令输出的结果写入fifo1中
     
    创建fifo。

    int mkfifo(const char *pathname, mode_t mode)

    函数执行成功返回0,否则返回-1,并设置变量errno。
     
     
    mkfifo函数例子。
    int main(int arg, char *args[])
    {
        mkfifo("fifo1", 0666);
        return 0;
    }
    删除fifo。

    int unlink(const char *pathname);

    函数执行成功返回0,否则返回-1,并设置变量errno。
     
     
    unlink函数例子。
    int main(int arg, char * args[])
    {
        int i = unlink("fifo1");
        if (i == -1)
        {
            printf(strerror(errno));
        }
        return 0;
    }
    打开和关闭FIFO。

    int open(const char *pathname, int flags);

    int close(int fd);

    Linux的一切都是文件这一抽象概念的优势,打开和关系FIFO和打开关闭一个普通文件操作是一样的。
     
     
     
    FIFO的两端使用前都必须要打开
    在读写FIFO时,如果FIFO以O_NONBLOCK和O_RDONLY标志打开,那么调用马上就会返回
    如果在读写FIFO时,如果FIFO以O_NONBLOCK和O_WRONLY标志打开,在FIFO还没有为读出数据打开时,调用open会返回一个错误。
    如果open中没有指定O_NONBLOCK,O_RDONLY将阻塞open调用,一直到另一个进程为写入数据打开FIFO为止。相同的,O_WRONLY也导致阻塞一直到为读出数据打开FIFO为止。
     
     
    向一个没有为读出数据打开的FIFO写入数据会导致SIGPIPE信号,并设置errno。
    在最后一个写数据的进程关闭FIFO以后,读数据的进程能在它下一次的读操作中监测到EOF标志
     
     
    读FIFO例子
    int main(int arg, char * args[])
    {
        int len = 0;
        char buf[PIPE_BUF];
        memset(buf, 0, sizeof(buf));
        int fd = open("fifo1", O_RDONLY);
        while ((len = read(fd, buf, sizeof(buf))) > 0)
        {
            printf("%s
    ", buf);
        }
        close(fd);
        return 0;
    }
     
    写FIFO例子
    int main(int arg, char * args[])
    {
        int len = 0;
        char buf[PIPE_BUF];
        memset(buf, 0, sizeof(buf));
        int fd = open("fifo1", O_WRONLY);
        while(1)
        {
            scanf("%s", buf);
            if (buf[0] == '0')
                break;
            write(fd, buf, sizeof(buf));
        }
        close(fd);
        return 0;
    }
     
  • 相关阅读:
    luoguP4336 [SHOI2016]黑暗前的幻想乡 容斥原理 + 矩阵树定理
    luoguP4208 [JSOI2008]最小生成树计数 矩阵树定理
    luoguP2303 [SDOI2012]Longge的问题 化式子
    poj1704 Georgia and Bob 博弈论
    poj3537 Crosses and Crosses 博弈论
    luoguP4783 [模板]矩阵求逆 线性代数
    luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分
    [Luogu5319][BJOI2019]奥术神杖(分数规划+AC自动机)
    Forethought Future Cup
    Codeforces Round 554 (Div.2)
  • 原文地址:https://www.cnblogs.com/shichuan/p/4496167.html
Copyright © 2011-2022 走看看