uc6

来源:互联网 发布:新旧系统数据迁移方案 编辑:程序博客网 时间:2024/05/16 12:56
回顾:
  文件 - 文件读写、字符串的处理、dup() dup2()文件描述符的复制、lseek()、fcntl()复制文件描述符、设置/获取文件表的状态、介绍了读写锁的概念
今天:
  文件锁、文件的其他相关函数、目录操作
  文件锁的原理:
    读写锁,包括一个读锁和一个写锁
    读锁:共享锁,锁定其他进程的写操作,允许其他进程读。
    写锁:独占锁,锁定其他进程的读操作和写操作。
   文件锁对应一个结构,内容:
   struct flock{
     short l_type; //锁的类型
     short l_whence;//锁的开始位置的参照点
     int l_start;//锁的开始位置的偏移量
     int l_len;//锁定的长度,字节为单位
     pid_t l_pid;//加锁的进程ID
   };
   l_type包括三种:F_RDLCK 读锁 F_WRLCK 写锁
            F_UNLCK 释放锁
   
   l_whence和l_start 联合决定锁定的开始位置,比如:l_whence = SEEK_SET l_start=10;从文件开始第10个字节上锁。
   l_pid只在F_GETLK时有效,其他时候置 -1 即可。
  文件锁不能锁定硬盘上的文件,不能锁定read/write函数,只能阻止其他进程的上锁行为。
文件锁的正确用法:在调用读函数read()之前应该上读锁,在调用写函数之前上写锁。
   使用文件锁时,其他进程默认是加不上锁会返回错误,可以用F_SETLKW实现加不上锁 继续等待的效果。
  fcntl的cmd为F_GETLK时,不是获取锁,而是:
   测试某个锁能否加上,不会真正的加锁。
   如果锁可以加,调用F_GETLK的结果:
    struct flock的其他数据不变,锁的类型l_type变为F_UNLCK。
   如果锁不可以加,调用F_GETLK的结果:
    struct flock的数据都会发生改变,锁的类型、锁的l_whence、l_start、l_len变成 当前正在起作用的锁的相关信息,l_pid 变成当前正在加锁的进程ID。
(不是测试的进程)
 
  文件的其他相关函数
   标C取文件大小:
    fseek()到最后
    ftell()取得返回值 就是文件的大小。
   Uc取文件的状态(属性)的函数:stat/fstat,经常用于取文件的大小。
    stat函数用字符串表示文件,fstat用文件描述符表示文件。stat函数不需要open()就可以取文件状态
   
  标C的时间表示方式有两种:
   1 time_t 秒差,和1970年1月1日0点0分0秒的秒查
   2 struct tm,包括 年月日小时分秒星期 等。
    计算机更多的使用time_t,显示时都用tm。
   localtime()可以实现time_t 到 tm的转换。
   
   access()函数可以判定文件的权限(读写执行)以及文件是否存在。
  umask()可以设置创建文件时的 权限屏蔽字。
  chmod() 可以修改文件的权限
  truncate()/ftruncate()可以指定文件的大小
  remove()可以删除文件/目录
  rename()可以修改文件名/目录名
  mmap映射文件 - 虚拟内存地址映射硬盘上的文件
   
 目录操作
  4个函数:
   mkdir() - 新建目录
   rmdir() - 删除 空目录
   chdir() - 改变当前目录(cd)
   getcwd()- 取得当前目录(pwd但不会打印)
  2个读目录函数:
   opendir() - 打开一个目录
   readdir() - 读目录,依次返回目录的子项
练习&作业:
  1 完成递归的练习
  2 写一个myls,实现 ls -l的功能。(不着急)
  3 今天代码较多,复习一下
一个myls,实现 ls -l的功能。(不着急)
  3 今天代码较多,复习一下

0 0
原创粉丝点击