搞file struct
angleboy大佬的博客阅读记录,下次看的时候不至于懵笔
fread比read更高层,read是最接近kernel的函数
_IO_FILE 大致分成三个部分
- flags
- stream buffer pointers
- _fileno:file discripter, reuturn by sys_open
_IO_FILE_plus, stdin, stderr, stdout,fopen的返回值都属于该结构
包括一个_IO_FILE结构体和_IO_jump_t*(指向虚表结构体的指针),任何的文件操作都是通过虚表
指针
_IO_list_all为链表头部,新打开的文件得到的filestruct放到头节点后面,后面依次是stderr, stdout, stdin
fopen步骤:
- malloc分配内存
- 初始化file struct
- 链接file struct
- 打开文件
fread步骤:
- 如果stream buffer为空则vtable->doallocate
- 读取数据到stream buffer(_IO_buf_base, _IO_buf_end)函数_IO_file_underflow
- 拷贝stream buffer内容到目标缓存区(_IO_read_ptr, _IO_read_end)函数_IO_file_xsgetn
fwrite工作流程:
- 如果stream buffer为空则vtable->doallocate
- 拷贝目标缓存区的stream bufffer,函数_IO_file_xsputn
- stream buffer写入文件
fclose工作流程:
- unlink file 结构体
- _IO_new_file_close_it(内部调用_IO_do_flush)释放stream buffer
- 关闭文件
- 释放结构体
_lock
1. _IO_lock_t*
2. 避免多线程race condition
3. 通常需要建立这样一个结构体
除了更改fopen获得的file struct外还可以搞stdin, stdout, stderr
FSOP
file-stream oriented programing
- 控制file struct链方式: _chain和_IO_list_all
- 搞事函数:_IO_flush_all_lockp(该函数不在虚表中),当glibc发生错误时会调用该函数,会遍历所有file struct链,调用_IO_OVERFLOW(vtable中)
vtable虚表验证(在house of orange中还没有出现),很难绕过
利用stream buffer和file descriptor
fwrite制造