文件描述符:
- 使用文件描述符访问文件,文件描述符是一个非负整数,当打开或创建一个文件时,内核向进程传递一个文件描述符,依照惯例,文件描述符取值通常为0、1、2(stdin,stdout,stderr)。
相关函数
函数open
、openat
:
1、open:*path(文件路径)、oflag(打开方式[只读、只写、读写打开]);
2、openat:*path(文件路径)、oflag(打开方式[只读、只写、读写打开])、fd
fd
参数作用于path
为相对路径名时,指出了相对路径名在文件系统中的起始位置,使得线程可以打开当前目录的相对目录,而非局限于当前工作目录,并避免了TOCTTOU错误(time-of-check-to-time-of-use,即函数调用之间彼此依赖,而两个调用之间文件可能改变了,造成先前的调用无效,导致程序脆弱)。
»»»
函数lseek
:
lseek:fd(文件描述符)、offset(偏移量)、whence(offset的解释变量)
- 调用
lseek
可以显式地为一个打开文件设置偏移量,其中whence
为SEEK_SET
,则偏移量设置为距文件开始处offset
个字节,为SEEK_CUR
,则设置为当前值加offset
(可正可负),为SEEK_END
,则设置为文件长度加offset
(可正可负)。- 函数
lseek
还可以用于检测一个文件是否可以设置偏移量,若文件描述符指向的是一个管道、FIFO或者网络套接字,则lseek
返回-1,并将errno设置为EPIPE
。
»»»
函数dup
、dup2
:
1、dup:fd(文件描述符);
2、dup2:fd(文件描述符)、fd2(新文件描述符)
- 作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。返回的新描述符与旧描述符共享一个文件表项。
- 调用
dup
可以复制一个文件描述符,并且返回该文件描述符的最小值;- 调用
dup2
可以指定新描述符的值,若fd2已经被打开,则先关闭;若fd2=fd,则返回fd2,而不关闭它;若fd≠fd2,清除fd2的文件描述符标志FD_CLOEXEC
,当fd2在进程调用exec时为打开状态。
»»»
函数sync
、fsync
、fdatasync
:
1、sync:void;
2、fsync:fd(文件描述符);
3、fdatasync:fd(文件描述符);
- 调用
sync
直接将修改过的块缓冲区排入写队列,然后返回,不等待实际写磁盘操作结束;
- 通常系统守护进程update周期性(30s)调用
sync
,保证定期冲洗内核的块缓冲区;
- 调用
fsync
可以将制定文件写入磁盘,并等待磁盘操作结束后才返回,fdatasync
与之相似,不同之处是后者只更新文件的数据区域,而前者还写入文件的属性。
»»»
函数fcntl
:
fcntl:fd(文件描述符)、cmd(命令参数)
- fcntl的主要功能为:复制已有的文件描述符、获取/设置文件描述符状态标志、获取/设置文件状态标志、获取/设置异步IO所有权、获取/设置记录锁。