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;
    }
     
  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/shichuan/p/4496167.html
Copyright © 2011-2022 走看看