UNIX环境高级编程第三章
1.对于内核,所有打开或者新创建的文件都通过文件描述符引用。open或者creat获得的文件描述符传递给read或者write做相关函数的第一参数。
【1】open函数,除非创建新的函数带第三个参数,否则都是两个参数。第一个参数代表文件路径名字;第二个是文件状态标志。文件状态标志包括必选的且只能选择其中一个的三个状态以及多个可选的状态,必选包括RDONLY/WRONLY/RDWR,可选包括每次写时追加到文件尾的O_APPEND(此方法可以使两个进程往同一个文件写时的操作变为两个原子操作,防止第二个进程写时覆盖掉第一个进程写的内容),O_EXCL判断文件是否存在,不存在则创建,等等其他。
【2】creat函数,只能以只读方式打开所创建的文件【3】close,关闭文件关闭同时记录锁
【3】lseek(int fd, off_t offset, int whence),whence是SEEK_SET时,文件偏移量为距文件offset个字节,whence为SEEK_CUR,文件偏移量与CUR偏移量有关,为CUR偏移量+offset个字节,为SEEK_END时,为文件长度+offset。偏移量的目的是,读写从偏移量处位置开始。如偏移量为10,则会从第10位字符读到最末一位。这就出现一个空洞的概念,即偏移量定位到超过文章长度的位置,则在原文件末尾与新开始操作的位置直接出现不需要分配磁盘块的空洞。这是允许的。
【4】内核使用三种数据结构表示打开的文件,不同进程间共享打开的文件。进程表项包括文件描述符,文件描述符包含一个文件描述符标志(目前只有一种:FD_CLOEXEC,包括状态0,exec不关闭,状态1,exec关闭)。以及一个指向文件表的文件指针,文件表包括文件状态标志(O_RDONLY/O_WRONLY/O_RDWR等这些),文件偏移量,以及指向V节点表的v节点指针。不同进程打开同一个文件时,包含文件类型和操作函数(v节点信息)以及索引节点(i节点信息)的v节点表是相同的。文件表和进程表项不同。

【5】为了read和write成为原子操作。使用能够顺序执行sleek和read以及sleek和write的pread以及pwrite函数。【6】dup和dup2用来复制一个已存在的文件描述符。dup返回一个可用的最小的文件描述符值,
duo2(fd,fd2)函数用fd2指定的描述符数值,如果fd2已经存在,则进行原描述符关闭,如果fd=fd2 ,则返回fd2,且不进行关闭。
【7】由于存在延迟写(即缓存区必须要写满或者缓存区需要重用才将缓存排入输出队列),引入fsync(fd),fdatasync(fd),sync(void)三个函数。通过守护进程定时调用sync,会将修改过的块缓冲区排入写队列。fsync和fdatasync对fd起作用,等待写磁盘操作结束就返回。区别在fsync可以同步更新文件的属性。
【8】fcntl函数根据打开的文件描述符就可以修改文件性质。int fcntl(fd,cmd,。。。)
(1)F_DUPED,复制一个现有描述符。返回新文件描述符是尚未打开的各描述符中大于或者等于第三个参数值中的最小值。与fd同一个文件表项,但是有不同的文件描述符。FD_CLOSEEXEC(文件描述符标志)被清除
(2)获得/设置文件描述符标记,F_GETFD或F_SETFD(FD_CLOEXEC)
(3)获得/设置文件状态标志F_GETFL或F_SETFL等。F_GETFL取得值之后要先与O_ACCMODE进行与取得访问模式位。才是O_RDONLY/O_WRONLY/O_RDWR三者之一。
int testfd = fcntl (fd,F_GETFL, 0);
testfd |= flag;
fcntl(fd, F_SETFL, testfd); 给fd在原来的文件状态标志基础上与了新的标志,并设置给fd。

浙公网安备 33010602011771号