UNIX下的文件操做

1、lseek
  一、每个打开的文件都一个与之相关的"文件位置"。
  二、文件位置一般状况是一个非负整数,用来度量文件从开始到结束的字节数。
  三、文件的读写操做都是从当前的文件位置开始的,根据所读写的字节数移动文件的位置。
  四、当使用open打开文件时除非设置O_APPEND参数,不然文件位置一概在开头。
  五、使用fseek/lseek仅是将文件位置记录在内核中,并不引起任何I/O操做。
  六、若是越过文件末尾位置写入数据,将在文件中造成黑洞,它不占用磁盘空间,但计算在文件大小内。

  off_t lseek(int fd, off_t offset, int whence);
  功能:调用文件的位置
  fd:文件描述符
  offset:偏移值
  whence:基准点
  SEEK_SET 开头位置
  SEEK_CUR 当前位置
  SEEK_END 末尾位置
  返回值:当前文件位置

2、文件描述符的复制
  int dup(int oldfd);
  功能:复制文件描述符
  oldfd:被复制的文件描述符
  返回值:新复制出的文件描述符(操做系统随机分配的),失败返回-1。


  int dup2(int oldfd, int newfd);
  功能:复制文件描述符
  oldfd:被复制的文件描述符
  newfd:指定新复制出的文件描述符,若是newfd已经打开,则先关闭再复制。
  返回值:新复制出的文件描述符(操做系统随机分配的),失败返回-1。

3、文件同步
  一、大多数磁盘进入读写时都会有缓冲机制,当咱们写入文件时实际上是写入到了缓冲区里并无写到磁盘中,直到缓冲区满才排队写入到磁盘中。
  二、这样作的处是下降了写操做的次数,提升程序的运行效率,但也形成了磁盘与文件的内容不一样步,这样可能会形成A程序数据已经写入,但B程序读不到。
  三、sync/fsync/fdatasync用于强制把缓冲区的内容同步到磁盘中。

  void sync(void);
  功能:把因此有修改过的文件同步到磁盘中,因此待同步文件会排队把数据同步的磁盘,而sync不会等到全部文件同步完成后才回,而是当即返回。

  int fsync(int fd);
  功能:指定某个文件的内容同步到磁盘,同步完成后才返回。async

  int fdatasync(int fd);
  功能:指定某个文件的内容同步到磁盘,同步完成后才返回,但只同步文件的数据,不一样步文件的属性。

4、获取文件的属性
  int stat(const char *path, struct stat *buf);
  功能:根据文件的路径,获取文件的属性

  int fstat(int fd, struct stat *buf);
  功能:根据文件描述符,获取文件的属性

  int lstat(const char *path, struct stat *buf);
  功能:根据文件的路径,获取软连接文件的属性。

  注意:stat会跟踪获取软连接的目标文件属性,而lstat只获取软连接文件的。

  文件属性结构体struct stat:
  dev_t st_dev; // 设备号
  ino_t st_ino; // i节点精心
  mode_t st_mode; // 文件类型和权限
  nlink_t st_nlink; // 硬连接数
  uid_t st_uid; // 属主id
  gid_t st_gid; // 属组id
  dev_t st_rdev; // 特殊设置id
  off_t st_size; // 文件的大小
  blksize_t st_blksize; // 系统IO块数
  blkcnt_t st_blocks; // 512字节块数
  time_t st_atime; // 最后访问时间
  time_t st_mtime; // 最后修改时间
  time_t st_ctime; // 最后属性修改时间函数


  时间转换:
  struct tm *localtime(const time_t *timep);
  功能:把time_t类型的时间转换成时间结构体
  struct tm 结构体:
  int tm_sec; /* seconds */
  int tm_min; /* minutes */
  int tm_hour; /* hours */
  int tm_mday; /* day of the month */
  int tm_mon; /* month */
  int tm_year; /* year */
  int tm_wday; /* day of the week */
  int tm_yday; /* day in the year */
  int tm_isdst;

5、权限屏蔽码
  当使用open/creat建立文件时,所设置的文件权限会减掉权限屏幕码所设置的权限。
  如何查看权限屏幕码:
  一、命令:umask
  二、函数:mode_t umask(mode_t mask);
  功能:修改权限屏蔽码
  返回值:修改为功后的权限屏蔽码
  注意:只是针对当前进程,而不会修改系统的权限屏蔽码

6、修改文件权限
  int chmod(const char *path, mode_t mode);
  功能:根据文件的路径修改文件的权限

  int fchmod(int fd, mode_t mode);
  功能:根据文件描述符修改文件的权限

7、修改文件的属主和属组
  int chown(const char *path, uid_t owner, gid_t group);
  功能:根据文件的路径修改文件的属主和属组

  int fchown(int fd, uid_t owner, gid_t group);
  功能:根据文件描述符修改文件的属主和属组

  int lchown(const char *path, uid_t owner, gid_t group);
  功能:根据文件的路径修改文件的属主和属组,只针对连接文件修改

  注意:普通用户没有修改的权限

8、修改文件的大小
  int truncate(const char *path, off_t length);
  功能:根据文件路径,修改文件的大小,多余的部分截取掉。

  int ftruncate(int fd, off_t length);
  功能:根据文件描述符,修改文件的大小,多余的部分截取掉。

  注意:若是要修改后大小超出文件本来的大小,就会造成黑洞。

9、建立删除硬连接文件
  int link(const char *oldpath, const char *newpath);
  功能:建立硬连接文件
  oldpath:被连接的文件路径
  newpath:连接文件的路径

  int unlink(const char *pathname);
  功能:删除连接文件

  int remove(const char *pathname);
  功能:根据文件路径删除文件

  int rename(const char *oldpath, const char *new‐path);
  功能:为文件重命名

  注意:普通文件就一种连接数量只有一个的硬连接文件,因此unlink也能用来删除普通文件。

10、软件连接文件的建立
  硬连接文件就一个文件名,是目录文件中的一个条目,而软连接文件是一个独立的文件,里面记录的是被连接的路径。
  int symlink(const char *oldpath, const char *newpath);
  功能:建立软连接文件,连接目标能够不存在
  oldpath:被连接文件能够不存在,只要最终建立出来,连接文件就能正常访问
  newpath:软连接文件路径。

  ssize_t readlink(const char *path, char *buf,size_t bufsiz);
  功能:读取软连接文件的信息到buf中
  buf:数据的存储位置
  bufsiz:buf的大小
  返回值:成功读取到的字节数

10、建立空目录/删除空目录
  int mkdir(const char *pathname, mode_t mode);
  功能:建立空目录
  pathname:路径
  mode:目录的权限

  int rmdir(const char *pathname);
  功能:删除空目录,只能删除目录。
  注意:操做系统没有提供删除非空目录的方法。
ui

相关文章
相关标签/搜索