UNIX环境编程_文件IO

文件描述符:

  • 使用文件描述符访问文件,文件描述符是一个非负整数,当打开或创建一个文件时,内核向进程传递一个文件描述符,依照惯例,文件描述符取值通常为0、1、2(stdin,stdout,stderr)。

相关函数

函数openopenat

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可以显式地为一个打开文件设置偏移量,其中whenceSEEK_SET,则偏移量设置为距文件开始处offset个字节,为SEEK_CUR,则设置为当前值加offset(可正可负),为SEEK_END,则设置为文件长度加offset(可正可负)。
  • 函数lseek还可以用于检测一个文件是否可以设置偏移量,若文件描述符指向的是一个管道、FIFO或者网络套接字,则lseek返回-1,并将errno设置为EPIPE

»»»

函数dupdup2

1、dup:fd(文件描述符);
2、dup2:fd(文件描述符)、fd2(新文件描述符)		
  • 作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。返回的新描述符与旧描述符共享一个文件表项。
  • 调用dup可以复制一个文件描述符,并且返回该文件描述符的最小值;
  • 调用dup2可以指定新描述符的值,若fd2已经被打开,则先关闭;若fd2=fd,则返回fd2,而不关闭它;若fd≠fd2,清除fd2的文件描述符标志FD_CLOEXEC,当fd2在进程调用exec时为打开状态。

»»»

函数syncfsyncfdatasync

1、sync:void;
2、fsync:fd(文件描述符);
3、fdatasync:fd(文件描述符);
  • 调用sync直接将修改过的块缓冲区排入写队列,然后返回,不等待实际写磁盘操作结束;
  • 通常系统守护进程update周期性(30s)调用sync,保证定期冲洗内核的块缓冲区;
  • 调用fsync可以将制定文件写入磁盘,并等待磁盘操作结束后才返回,fdatasync与之相似,不同之处是后者只更新文件的数据区域,而前者还写入文件的属性。

»»»

函数fcntl

fcntl:fd(文件描述符)、cmd(命令参数)
  • fcntl的主要功能为:复制已有的文件描述符、获取/设置文件描述符状态标志、获取/设置文件状态标志、获取/设置异步IO所有权、获取/设置记录锁。

你可能感兴趣的:(学习笔记,unix)