• 系统IO


    系统IO

     系统IO是由linux内核定义的一些文件IO操作函数,系统IO有如下特点:
      1.由操作系统提供的接口函数,特点是特别简洁,功能单一;
      2.没有提供缓冲区,因此对于处理海量数据时效率比较低;
      3.套接字、设备文件只能使用系统IO来访问。

    系统IO接口

    open (打开、创建文件)
        头文件:
            #include <sys/types.h>
            #include <sys/stat.h>
            #include <fcntl.h>
        函数原型:
            int open(const char *pathname, int flags);
            int open(const char *pathname, int flags, mode_t mode);
        参数分析:
            pathname  --> 需要打开文件的路径 + 名字
            flags --> 
                · O_RDONLY 以只读方式打开文件
                · O_WRONLY 以只写方式打开文件
                · O_RDWR 以可读写方式打开文件. 上述三种标志是互斥的, 也就是不可同时使用, 但可与下列的旗标利用 OR(|)运算符组合.
                · O_CREAT 若欲打开的文件不存在则自动建立该文件.
                · O_TRUNC (清空文件)若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为 0, 而原来存于该文件的资料也会消失.
                · O_APPEND (追加文件)当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
                · O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
                · O_SYNC 以同步的方式打开文件.
                · mode --> 设置文件的初始权限(只有创建文件时生效)
                   0654  -->拥有者可读可写
                   同组用户 可读 可执行
                   其他用户   只读
        返回值:
            成功 返回文件描述符(new file descriptor),为在当前进程中表示该文件的编号。
            失败 返回-1 , 并且会设置errno 
    
    write (将数据写入已打开的文件内)
        头文件:
            #include <unistd.h>
        定义函数:
            ssize_t write (int fd, const void * buf, size_t count);
            ssize_t read  (int fd,       void * buf, size_t count);
        参数分析:
            fd --> 需要写入信息的文件的文件描述符(open的返回值)
            buf --> 需要写入信息的内存地址
            count --> 需要写入的字节数
        返回值:
            成功 返回实际写入的字节数
            失败 有错误发生时返回-1, 并将错误代码存入 errno 中.
    
    lseek (移动文件的读写位置)
        头文件:
            #include <sys/types.h>
            #include <unistd.h>
        定义函数:
            off_t lseek(int fildes, off_t offset, int whence);
        参数分析:
            fildes --> 需要偏移读写位置的文件件描述符
            offset --> 偏移量, 根据whence 有不同偏移方式
            whence --> 为下列其中一种:
                · SEEK_SET 参数 offset 即为新的读写位置.
                · SEEK_CUR 以目前的读写位置往后增加 offset 个位移量.
                · SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量. 
                           当 whence 值为 SEEK_CUR 或SEEK_END 时, 参数 offet 允许负值的出现.
        返回值:
            成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 
            若有错误则返回-1, errno 会存放错误代码.
    
    close (关闭文件)
        头文件:
            #include <unistd.h>
        定义函数:
            int close(int fd);
        参数分析:
            fd --> 需要关闭的文件的文件描述符
        返回值:
            若文件顺利关闭则返回 0
            发生错误时返回-1.
    

    注意

    1.打开 open可以用来打开所有的文件(除了目录、套接字),但是只能创建普通文件;
    2.读取 read既可以处理二进制数据,也可以处理文本数据, 对于处理海量数据时效率较低;
    3.写入 write既可以处理二进制数据,也可以处理文本数据, 对于处理海量数据时效率较低;
    4.读写文件使会改变文件读写指针的位置,使用函数lseek可以调整文件的读写位置,成功时则返回目前的读写位置, 也就是距离文件开头多少个字节;
    5.文件操作完毕后需要关闭文件。

    测试代码

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    
    int main(int argc, char const *argv[])
    {
        char *name = "./open.h";
        int fd = open(name,  O_RDWR);
    
        if (fd<0)
        {
            printf("open %s error , msg: %s
    " , name, strerror(errno));
            return -1;
        }
        else
        {
            printf("file open/creat succeed:%d
    ", fd);
        }
    
        char w_buf1[32] = "Hello Arno";
        int ret = write(fd, w_buf1, strlen(w_buf1));
        if(-1 == ret)
        {
            printf("write %s error , msg: %s
    " , name, strerror(errno));
            return -1;
        }
    
        ret = lseek(fd, SEEK_SET, 0);
        if(-1 == ret)
        {
            printf("lseek %s error , msg: %s
    " , name, strerror(errno));
            return -1;
        }
    
        char r_buf[32] = {''};
        ret = read(fd, r_buf, sizeof(r_buf));
        if(-1 == ret)
        {
            printf("read %s error , msg: %s
    " , name, strerror(errno));
            return -1;
        }
    
        printf("r_buf:%s
    ", r_buf);
    
        close(fd);
    
        return 0;
    }
    
  • 相关阅读:
    Flink延时监控
    FLink全链路时延—测量方式
    Linux搭建SFTP服务器
    Red Hat:USING AMQ STREAMS WITH MIRRORMAKER 2.0
    idea 搭建运行kafka 源码
    Kafka Connect Concepts
    Java IPv6相关属性preferIPv4Stack、preferIPv6Addresses介绍
    如何确定Flink反压的根源?How to identify the source of backpressure?
    如何成为 Apache 项目的 Committer
    Apache Kafka KIP 介绍
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14142996.html
Copyright © 2020-2023  润新知