系统编程手册 第四章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki

概述

  • 所有执行I/O操作的系统调用都以文件描述符,一个非负整数来指代打开的文件
  • 文件描述符
    1. 0 标准输入 stdin
    2. 1 标准输出 stdout
    3. 2 标准错误 stderr
  • 四个主要系统调用
    1. fd = open(pathname,flags,mode)函数打开pathname所标识的文件,并返回文件描述符,如果文件不存在,open()函数可以创建,flags参数可以指定文件的打开方式
    2. numread = read(fd,buffer,count)调用从fd中打开文件中读取至多count字节的数据,并存储到buffer中,read()的返回值为实际读取的字节数,如果无字节读,返回0
    3. numwritten = write(fd,buffer,count)调用从buffer读取多达count字节的数据写入由fd所指代的已打开的文件中,write()的返回值为实际写入文件的字节数
    4. status = close(fd)在所有I/O完成后,调用close(),释放文件描述符fd和与之相关的内核资源

通用I/O

打开一个文件:open()

  • open()调用既能打开一个已存在的文件,也能创建一并打开一个新文件
  • #include<sys/stat.h> #include<fcntl.h> int open(const char *pathname,int flags,...);
  • 要打开的文件由参数pathname来标识
  • 参数flags为位掩码,用于指定文件的访问模式,可以表示:只读(O_RDONLY)、只写(O_WRONLY)、读写(O_RDWD)

open()调用所返回的文件描述符数值

  • 如果调用成功,必须保证其返回值为进程中未用文件描述符中数值最小者

flags参数值

  1. O_RDONLY:只读
  2. O_WRONLY:只写
  3. O_RDWD:读写
  4. O_CLOEXEC:设置close-on-exec标志
  5. O_CREAT:文件不存在则创建
  6. O_DIRECT:无缓冲的输入输出
  7. O_EXCL:与O_CREAT结合使用,表示文件存在则不会打开文件,且open()调用失败,返回错误
  8. O_LARGEFILE:在32位系统中使用此标志打开大文件
  9. O_NOATIME:调用read()不修改文件最近访问时间
  10. O_NOCTTY:不要让pathname成为控制终端
  11. O_NOFOLLOW:对符号链接不解引用
  12. O_TRUNC:截断文件,长度为0
  13. O_APPEND:在文件末尾追加数据
  14. O_ASYNC:当I/O操作可行,产生信号
  15. O_DSYNC:提供同步的I/O数据完整性
  16. O_NONBLOCK:以非阻塞方式打开
  17. O_SYNC:以同步方式写入文件

creat()系统调用

  • #include<fcntl.h> int creat(const char *pathname,mode_t mode)
  • creat()系统根据pathname参数创建并打开一个文件,若文件存在,打开文件,清空文件内容,长度清为0
  • 相当于fd = open(pathname,O_WRONLY | O_CREAT | O_TRUNC,mode);

读取文件内容:read()

  • #include<unistd.h> ssize_t read(int fd,void *buffer,size_t count)
  • 从fd所代指的文件中读取数据,存放在buffer参数的内存缓冲区地址

数据写入文件:write()

  • #include<unistd.h> ssize_t write(int fd,void *buffer,size_t count);
  • buffer参数为要写入文件中数据的内存地址,fd为一文件标识符,代指数据要写入的文件

关闭文件:close()

  • #include<unistd.h> int close(int fd);

改变文件偏移量:lseek()

  • 对于每个打开的文件,系统内核会记录其文件偏移量,有时也将文件偏移量称为读写偏移量或者指针
  • 文件偏移量是指执行下一个read或write操作的文件起始位置,会以相对于文件头部起始点的文件当前位置来表示
  • 文件第一个字节的偏移量是0
  • 针对文件描述符fd参数所代指的已经打开的文件,lseek()系统调用依照offset和whence参数值调整该文件的偏移量
  • #include<unistd.h> off_t lseek(int fd,off_t offset,int whence);return new file offset
  • offset 参数指定了一个以字节为单位的数值,whence 参数表明应参照哪个基点来解释offset参数
  • whence参数:
    1. SEEK_SET:设置为从文件头部起始点开始的offset个字节
    2. SEEK_CUR:相对与现在的文件偏移量,调整offset个字节
    3. SEEK_END:设置为起始于文件尾部的offset个字节

文件空洞

ioctl()

  • #include<sys/stat.h> int ioctl(int fd,int request,.../*argp*/);return request
  • fd参数为某个设备或文件已打开的文件描述符,request参数指定了将在fd上执行的控制操作
  • ioctl()调用的第三个参数可以是任意数据类型,ioctl()根据request的参数值来确定argp所期望的类型,通常情况下,argp是指向整数或结构的指针,有些情况下不用argp
⚠️ **GitHub.com Fallback** ⚠️