前言:小洋人终于恢复了,好似鬼门关逛了一遭,都开始思考人生了,目前已恢复。
------什么是I/O重定向?
使用open函数重复打开同一个文件,实际上是把文件表中的文件描述符复制一份,形成一个新的文件表项。文件表项是独立的,其中保存着每个文件的读写位置,但都指向同一个V节点指针,也就是系统内核中只会有一个V节点。
------何为打开文件?
应用程序要求内核打开某个文件,来访问一个I/O设备,内核会返回一个非负整数(即描述符)给应用程序,应用程序只记住这个描述符,后续所有的操作都以描述符来标识文件。
------文件的操作函数有哪些?
往文件写数据:write函数
从文件读数据:read函数
------读写二进制与读写文本文件的区别?
上述的read和write函数读写文件都是面向二进制字节流的I/O操作,文本文件打开后观看直观。如果用上述两个函数,用文本方式保存数据,就需要做点额外的工作:先格式为字符串,存入后,再解析为二进制数据放到内存中。
------文件读写位置的特点?
文件读写位置通常是一个非负的整数,用off_t类型表示(32为系统上为long int,64位系统为long long int),保存在文件表项中,每个文件是读写位置是独立的。初始化值为0。
------什么是文件的随机访问?
注意这个随机不是未知的随机数,而是人为的设置从某个位置开始读写。使用lseek函数可以设置,比如相对文件头或文件尾货当前位置偏移多少,函数成功返回调整后的文件读写位置。
------系统I/O和标准I/O?
系统I/O:通过open\read\write\close等系统调用实现文件I/O。
标准I/O:通过fopen\fread\fwrite\fclose等标准库函数实现文件I/O。
标准I/O也是通过系统I/O进行工作的,但因为标准库中做了缓冲区优化,标准I/O执行起来会比系统I/O快一些。
------复制文件描述符?
通过复制文件描述符,操作的是同一个文件描述符,其中的读写位置也是公用的。用于复制文件描述符的函数:dup和dup2
------文件同步与文件控制?
文件同步:将于文件有关的脏缓冲区中的数据和元数据回写到磁盘上。函数fsync、fdatasync、sunc。
文件控制:把对文件操作的很多功能集中到一个函数中,不同的功能参数不同,函数是fcntl。函数功能例如复制文件描述符、获取/设置文件描述符标志、获取/追加文件状态标志。
------文件锁?
两个进程同时向一个文件的某个特定区域写入数据时,容易产生混乱;一个进程写,一个进程读也会产生问题;两个进程同时读不会有问题。
写锁:是独占锁,只有一个进程可以加写锁成功,其他进程阻塞,等待写锁解除。
读锁:是共享锁,一个文件的特定区域可以同时加多把读锁。
使用fcntl函数可以加锁。
------文件锁的内核结构?
在V节点中有锁表指针,其指向锁节点,其中信息包括锁类型、锁区起点、锁区大小、加锁进程、下一个锁节点。
------文件元数据有哪些?
文件元数据存放在该文件的i节点中。可以用函数获取文件的元数据信息,函数有stat、fstat、lstat。其中lstat函数区别于其他两个的特点是不跟踪符号链接。(符号链接文件是指一个文件中存储的是其他文件的路径信息)文件的元数据有设备ID、i节点号、文件类型和权限、硬链接数、拥有者用户ID、拥有者组ID、特殊设备ID、总字节数、最后访问时间、最后修改时间和最后状态改变时间。