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

    有名管道
    1、查看命令:man 3 mkfifo

    2、头文件:#include <sys/types.h>
    #include <sys/stat.h>

    3、函数原型:int mkfifo(const char *pathname, mode_t mode);
    a、*pathname:有名管道的名字 例如:/home/gec/myfifo
    b、 mode:八进制的权限, 例如:0777

    4、返回值:
    成功:0
    失败-1

    5、函数特点:
    有名管道存在于文件系统中,提供写入原子性特征,共享内存效率高

    6、有名管道的特征:
    a、有名字,储存于普通文件系统中
    b、任何具有相应权限的进程都可以使用open()来获取FIFO的文件描述符
    c、跟普通文件一样,用read()和writ()来读和写
    d、不能用lseek来定位
    e、具有写入原子性,支持多写者同时进行写操作而数据不会相互践踏

    1)读取数据的代码:fifo_read.c
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<string.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<errno.h>
    
    #define FIFO "/home/gec/FIFO" /*有名管道的名字*/
    #define LENGTH 50 /*字符数组的长度*/
    int main(int argc,char **argv)
    {
        int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存放打开有名管道的文件描述符*/
        char buf[LENGTH];
        
        if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0否则返回非0的数*/                      
        {
            ret = mkfifo(FIFO,0777); /*创建有名管道,成功返回0,失败返回-1*/
            if(ret == -1) /*创建有名管道失败*/
            {
                perror("mkfifo");
                exit(1);
            }
        }
        
        fd = open(FIFO,O_RDONLY); /*已读方式打开有名管道,不能同时以读写权限打开,成功返回文件
                                     描述符,失败返回-1*/
        if(fd  == -1) /*打开失败*/
        {
            perror("open");
            exit(1);
        }
        puts("从有名管道中读取到的数据:");
        while(1)
        {
            memset(buf,0,sizeof(buf)); /*清空缓冲区*/
                
            read(fd,buf,sizeof(buf));  /*阻塞读取有名管道中的数据到buf中*/
            
            printf("%s",buf);
            
            if(strncmp(buf,"q",1) == 0) /*buf中的数据和q比较,如果相等,则返回0*/
            {
                break;
            }
        }
        
        close(fd); /*关闭有名管道*/
        return 0;
    }
    (2)写入数据的代码:fifo_write.c
    #include<stdio.h>
    #include<unistd.h>
    #include<sys/stat.h>
    #include<sys/types.h>
    #include<string.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<errno.h>
    
    #define FIFO "/home/gec/FIFO" /*有名管道的名字*/
    #define LENGTH 50 /*字符数组的长度*/
    int main(int argc,char **argv)
    {
        int ret,fd; /*ret用来接收mkfifo返回的值,fd用来存放打开有名管道的文件描述符*/
        char buf[LENGTH];
        
        if(access(FIFO,F_OK))/*判断是否已经创建了有名管道,如果已经创建,则返回0 否则返回非0的数*/                    
        {
            ret = mkfifo(FIFO,0777); /*创建有名管道,成功返回0,失败返回-1*/
            if(ret == -1) /*创建有名管道失败*/
            {
                perror("mkfifo");
                exit(1);
            }
        }
        
        fd = open(FIFO,O_WRONLY); /*以写方式打开有名管道,不能同时以读写权限打开,成功返回文件
                                     描述符,失败返回-1*/
        if(fd == -1) /*打开失败*/
        {
            perror("open");
            exit(1);
        }
        
        puts("请输入数据到有名管道中,输入q退出:");
        while(1)
        {
            memset(buf,0,sizeof(buf)); /*清空缓冲区*/
        
            fgets(buf,sizeof(buf),stdin); /*从终端输入数据到buf中*/
            write(fd,buf,strlen(buf));  /*阻塞把数据写入有名管道*/
            
            if(strncmp(buf,"q",1) == 0) /*buf中的数据和q比较,如果相等,则返回0*/
            {
                printf("aaaa
    ");
                break;
            }
        }
        
        close(fd); /*关闭有名管道*/
        return 0;
    }
    鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
  • 相关阅读:
    The first appliaction for "Hello World!"
    zone
    learn to study
    深入理解 Angular 2 变化监测和 ngZone
    看看吧
    生命周期钩子
    一个简单的todo
    依赖注入
    @Output()
    @Input
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/7297405.html
Copyright © 2011-2022 走看看