Linux平台下的文件操作
库函数:由库来实现,在用户态执行,部分库函数需要转调系统调用函数。
系统调用函数:是系统内核提供给用户访问系统管理底层硬件的接口,系统调用函数用户层只是一个接口,函数的具体实现都是由操作系统实现,并且在内核态执行。
Open函数:打开(或创建)一个文件
Int open(const char *path,int flag, /*int mode*/)这是系统调用函数open函数的参数列表,该函数返回一个非负整型值作为文件描述符,出错返回-1.第一个参数代表要打开的文件的路径和文件名,第二个参数代表指定的打开方式,第三个参数只有在需要打开的文件不存在,新创建时指定其访问权限时使用。
打开方式:
- O_RDONLY:以只读方式打开
- O_WRONLY:以只写方式打开
- O_RDWR:以读写方式打开
注意:在上面这三个常量中必须指定一个且只能指定一个。
- O_CREAT:若文件不存在,则创建它,此时会用到第三个参数
- O_TRUNC:如果文件存在且只为读写或写打开,将其长度截断为0
- O_APPEND:每次写时都追加到文件的末尾。
Read函数:读数据
Int read(int fd,void *buff, int size)该函数返回值代表读到的实际数据字节数的字节个数,fd表示要写入文件的文件描述符(open函数的返回值指定操作打开文件),buff表示读取的内容的存储缓冲区,size指定要读的数据的字节数
Write函数:写入数据
Int write(int fd, void *buff, int size)该函数返回值表示写成功的字节数,fd表示要写入的文件的文件描述符,buff指定要写的数据的起始地址,size表示要写的数据的字节长度
Close函数:关闭一个文件
Int close(int fd)关闭文件描述符为fd的文件
Lseek函数:移动读写游标
Int lseek(int fd, int size, int flag)fd表示文件描述符,size表示相对于第三个参数flag要移动的字节数。Flag的值为宏:SEEK_SET, SEEK_CUR, SEEK_END(分别表示文件的起始位置,当前位置和文件末尾)。
系统调用函数的执行过程:
每一个系统调用函数都有其唯一的系统调用号,当用户调用一个系统调用函数时,
- 首先会把该系统调用函数的系统调用号用eax寄存器保存起来,
- 然后保存进程运行的状态(即保存现场)
- 触发0x80中断,由内核态开始接管并且执行中断处理程序
- 在内核中有一个系统调用表,上面记录了每个系统调用号相对应的系统调用函数的位置,找到该位置,开始执行系统调用函数
- 系统调用函数执行完成,返回用户态继续执行进程