• 【Linux_Unix系统编程】Chapter4 文件IO


    Chapter4 文件IO

    4.1 概述
    文件描述符 == Windows的句柄
    标准文件描述符:

    0 标准输入 STDIN_FILENO stdin
    1 标准输出 STDOUT_FILENO stdout
    2 标准错误 STDERR_FILENO stderr

    (1):fd = open(pathname, flags, mode)
    (2):numread = read(fd, buffer, count)
    (3):numwritten = write(fd, buffer, count)
    (4):status = close(fd)

    4.2 通用IO

    4.3 打开一个文件:open()
    open()既能打开一个已经存在的文件,也可以创建并打开
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char* pathname, int flag, .../*mode_t mode*/);
    flag: 掩码,用于指定文件的访问模式。

    文件的访问模式:
    O_RDONLY 以只读的方式打开文件
    O_WRONLY 以只写的方式打开
    O_RDWR 以读写的方式打开

    open()调用所返回的文件描述符数值:
    SUSv3规定,如果调用open()成功,必须保证其返回值为进程未使用文件描述符中数值最小者。
    eg:确保使用标准输入(文件描述符0)打开文件。
    if(close(STDIN_FILENO) == -1)
    errExit("close");

    fd = open(pathname, o_RDONLY);
    if(fd == -1)
    errExit("open");

    4.3.1 open()调用中的flags参数
    (1):文件的访问模式, O_RDONLY, O_WRONLY,O_RDWR标志,调用open()是不能同时使用。调动fcntl()的F_GETFL操作能够检索文件的访问模式。
    (2):
    (3)

    O_APPEND:总是在文件尾部追加数据
    O_ASYNC:当对于open()调用所返回的文件描述符可以实行I/O操作时,系统会产生一个信号通知进程。
    O_CLOSEXEC: 为新的文件描述符启用close-on-flag标志(FD_CLOEXEC)。
    ⋯⋯

    4.3.2 open()函数错误
    若打开文件发生错误,open()将返回-1,错误号errno标识错误原因。
    EACCES:文件权限不允许调用进程以flags蚕食指定的方式打开文件
    EISDIR:所指定的文件属于目录,而调用者企图进行写操作。
    EMFILE:进程打开的文件数量达到了进程资源的设定上限
    ENFILE:文件打开资源达到了系统允许的上限
    ENOENT:文件不存在且未指定O_CREATE标志,或者指定的路径目录之一不存在。
    EROFS:文件属于只读文件系统
    ETXTBSY:指定的文件为可执行文件,且在运行。

    4.3.3 create()系统调用
    #include <fcntl.h>
    int create(cosnt char *pathname, mode_t mode);
    create()系统调用等价于如下open()调用
    fd = open(pathname, O_WRONLY | O_CREATE | O_TRUNC. mode);

    4.4 读取文件内容: read()
    #include <unistd.h>
    ssize_t read(int fd, void *buffer, size_t count);
    count : 最多能读取的字节数
    size_t : 无符号整形 ssize_t: 有符号整形
    注意:系统调用不会分配内存缓冲区用于返回信息给调用者。

    使用read()从终端读取一连串字符,
    char buffer[MAX_READ + 1];
    ssize-t numRead;

    numRead = read(STDIN_FILENO, buffer, MAX_READ)'
    if(numRead == -1)
    errExit("read");

    buffer[numRead] ='';
    printf("The input data was: %s ", buffer);

    4.5 数据写入文件: write()
    #include <unistd.h>
    sszie_t write(int fd, void *buffer, size_t count);

    4.6 关闭文件:close()
    #inclue <unistd.h>
    int close(int fd);

    4.7 改变文件偏移量: lseek()
    #inclue <unistd.h>
    off_t lseek(int fd, offst_t offset, int whence);
    offset : 指定一个以字节为单位的数值。
    whence:表明应参照那个基点来解释offset
    SEEK_SET: 从文件头部开始
    SEEK_CUR: 相对当前文件偏移量
    SEEK_END: 文件尾部

    eg:获取文件偏移量的当前位置 curr = lseek(fd, 0, SEEK_CUR);

    文件空洞:

    如果文件偏移量跨越了文件结尾,然后再执行I/O操作时候,read()调用将返回0,表示文件结尾。但是write()函数可以再文件结尾后的任意位置写入数据。
    从文件结尾后到新写入数据间的这段空间被称为文件空洞。从编程角度看,文件空洞中是存在字节的,读取空洞将返回以0(空字节)填充的缓冲区。

    4.8 通用I/O模型以外的操邹:ioctl()
    #include <sys/ioctl.h>
    int ioctl(int fd, int request, .../* argp */)

    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    BNUOJ 34978 汉诺塔 (概率dp)
    hdu1427 速算24点
    vim学习之以退为进——可反复移动和可反复改动的美妙结合
    C++设计模式实现--策略(Strategy)模式
    ios怎样在一个UIImageButton的里面加一些自己定义的箭头
    HTML5 Canvas 画图入门
    AT3728 Squirrel Migration
    HTTP请求的GET与POST方式的区别
    HTTP 的请求过程?
    servlet的生命周期
  • 原文地址:https://www.cnblogs.com/zhaohu/p/8048027.html
Copyright © 2020-2023  润新知