系统编程手册 第四章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki
- 所有执行I/O操作的系统调用都以文件描述符,一个非负整数来指代打开的文件
- 文件描述符
- 0 标准输入 stdin
- 1 标准输出 stdout
- 2 标准错误 stderr
-
四个主要系统调用
- fd = open(pathname,flags,mode)函数打开pathname所标识的文件,并返回文件描述符,如果文件不存在,open()函数可以创建,flags参数可以指定文件的打开方式
- numread = read(fd,buffer,count)调用从fd中打开文件中读取至多count字节的数据,并存储到buffer中,read()的返回值为实际读取的字节数,如果无字节读,返回0
- numwritten = write(fd,buffer,count)调用从buffer读取多达count字节的数据写入由fd所指代的已打开的文件中,write()的返回值为实际写入文件的字节数
- status = close(fd)在所有I/O完成后,调用close(),释放文件描述符fd和与之相关的内核资源
- open()调用既能打开一个已存在的文件,也能创建一并打开一个新文件
#include<sys/stat.h> #include<fcntl.h> int open(const char *pathname,int flags,...);
- 要打开的文件由参数pathname来标识
- 参数flags为位掩码,用于指定文件的访问模式,可以表示:只读(O_RDONLY)、只写(O_WRONLY)、读写(O_RDWD)
- 如果调用成功,必须保证其返回值为进程中未用文件描述符中数值最小者
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWD:读写
- O_CLOEXEC:设置close-on-exec标志
- O_CREAT:文件不存在则创建
- O_DIRECT:无缓冲的输入输出
- O_EXCL:与O_CREAT结合使用,表示文件存在则不会打开文件,且open()调用失败,返回错误
- O_LARGEFILE:在32位系统中使用此标志打开大文件
- O_NOATIME:调用read()不修改文件最近访问时间
- O_NOCTTY:不要让pathname成为控制终端
- O_NOFOLLOW:对符号链接不解引用
- O_TRUNC:截断文件,长度为0
- O_APPEND:在文件末尾追加数据
- O_ASYNC:当I/O操作可行,产生信号
- O_DSYNC:提供同步的I/O数据完整性
- O_NONBLOCK:以非阻塞方式打开
- O_SYNC:以同步方式写入文件
#include<fcntl.h> int creat(const char *pathname,mode_t mode)
- creat()系统根据pathname参数创建并打开一个文件,若文件存在,打开文件,清空文件内容,长度清为0
- 相当于
fd = open(pathname,O_WRONLY | O_CREAT | O_TRUNC,mode);
#include<unistd.h> ssize_t read(int fd,void *buffer,size_t count)
- 从fd所代指的文件中读取数据,存放在buffer参数的内存缓冲区地址
#include<unistd.h> ssize_t write(int fd,void *buffer,size_t count);
- buffer参数为要写入文件中数据的内存地址,fd为一文件标识符,代指数据要写入的文件
#include<unistd.h> int close(int fd);
- 对于每个打开的文件,系统内核会记录其文件偏移量,有时也将文件偏移量称为读写偏移量或者指针
- 文件偏移量是指执行下一个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参数:
- SEEK_SET:设置为从文件头部起始点开始的offset个字节
- SEEK_CUR:相对与现在的文件偏移量,调整offset个字节
- SEEK_END:设置为起始于文件尾部的offset个字节
#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** ⚠️