zoukankan      html  css  js  c++  java
  • 《UNIX环境高级编程》读书笔记 —— 文件 I/O

    打开或创建一个文件

    #include <fcntl.h>
    int open(const char *pathname, int oflag, .../*mode_t mode*/);
        返回值:若成功则返回文件描写叙述符,若出错则返回-1

    oflag选项:
    O_RDONLY
    O_WRONLY
    O_RDWR

    以上三个常量中必须指定一个,且仅仅能指定一个。
    下面常量都是可选的:
    O_APPED     每次写时追加到文件尾
    O_CREAT     若文件不存在,则创建
    O_EXCL      若同一时候指定了O_CREAT。而文件已经存在,则出错;否则创建文件
    O_TRUNC     若文件存在且为仅仅写或读写打开成功。则讲文件截断为0
    O_NOCTTY    
    O_NONBLOCK  若pathname指定的是一个FIFO、一个快特殊文件或者一个字符特殊文件,则此选项为文件的本次打开操作和兴许的I/O操作设置非组赛模式。

    O_DSYNC     每次write都等待物理I/O完毕。但不等待文件属性更新
    O_RSYNC
    O_SYNC      每次write都等待物理I/O完毕。包含write引起的文件属性更新所需的I/O



    #include <fcntl.h>
    int create(const char *pathname, mode_t mode);
        返回值:若成功则返回为仅仅写打开的文件描写叙述符。若出错则返回-1
        
    该函数等效于:
        open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)
        

    关闭一个打开的文件

    #include <unistd.h>
    int close(int filedes);
        返回值:若成功则返回0,若出错则返回-1

    关闭一个文件时还会释放该进程在该文件上的全部加锁。


    当一个进程结束时,内核会自己主动关闭它全部打开的文件。


    为一个打开的文件设置偏移量

    #include <fcntl.h>
    off_t lseek(int filedes, off_t offset, int whence);
        返回值:若成功则返回新的文件偏移量,若出错则返回-1

    whence取值:
    SEEK_SET    将文件偏移设置为距文件開始处offset个字节
    SEEK_CUR    将文件偏移设置为当前值加offset。offset可为正或负
    SEEK_END    将文件偏移设置为文件长度加offset。offset可为正或负

    管道、FIFO和网络套接字不可设置偏移量


    文件读写

    #include <unistd.h>
    ssize_t read(int filedes, void *buf, size_t nbytes);
        返回值:若成功则返回读到的字节数,若已到文件尾则返回0。若出错则返回-1

    #include <unistd.h>
    ssize_t write(int filedes, void *buf, size_t nbytes);
        返回值:若成功则返回已写的字节数。若出错则返回-1


    文件共享


    拷贝文件描写叙述符

    #include <unistd.h>
    int dup(int filedes);
    int dup2(int filedes, filedes2);
        返回值:若成功返回新的文件描写叙述符。若失败返回-1

    dup返回的是当前可用的最小的文件描写叙述符
    dup2则返回filedes2所指定的文件描写叙述符,若filedes2已经存在,则先将其关闭


    文件同步

    #include <unistd.h>
    int fsync(int filedes);
    int fdatasync(int filedes);
    void sync();

    sync    该函数仅仅是将全部改动过的块缓存增加写队列。并不等真正的写磁盘结束就返回,系统update守护进程会定期(30秒)调用该函数
    fsync   仅仅针对filedes描写叙述符起作用。而且等待写磁盘操作结束然后返回
    fdatasync   类似于fsync,但它仅仅影响文件的数据部分。不同步更新文件属性

    #include <fcntl.h>
    int fcntl(int filedes, int cmd, .../* arg */);
        返回值:若成功则依赖于cmd,若失败则返回-1

    文件控制

    fcntl的5种功能:

    复制一个现有的描写叙述符  cmd = F_DUPFD
    获得/设置文件描写叙述符标记    cmd = F_GETFD / F_SETFD
        眼下仅仅有一个标志:FD_CLOEXEC
    获得/设置文件状态标记 cmd = F_GETFL / F_SETFL
        文件状态标志:O_RDONLY  仅仅读打开
                      O_WRONLY  仅仅写打开
                      O_RDWR    读写打开
                      O_APPEND  *每次写时追加
                      O_NONBLOCK    *非堵塞模式
                      O_SYNC    *等待写完毕(数据和属性)
                      O_DSYNC   *等待写完毕(仅数据)
                      O_RSYNC   *同步读、写
                      O_FSYNC   *
                      O_ASYNC   *
                    加*号的为F_SETFL所能改动的
    获得/设置异步I/O全部权   cmd = F_GETOWN / F_SETOWN
    获得/设置记录锁    cmd = F_GETLK / F_SETLK / F_SETLKW

    #include <unistd.h>
    int ioctl(int filedes, int request, ...);
        返回值:若出错返回-1,成功返回其它返回值
       
  • 相关阅读:
    Tomcat项目部署
    java 项目时间和服务器时间不一致
    初始bat命令
    前端入门学习路线
    后台报错java.lang.IllegalArgumentException: Invalid character found in the request target.
    mysql
    java运行时数据区
    java 静态初始化块,初始化块,构造器执行顺序
    java byte和char
    springboot加载外部的配置文件
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6791848.html
Copyright © 2011-2022 走看看