• unix c 05


    dup和dup2用于复制文件描述符,区别在于dup2可以指定新的文件描述符的数值,如果新的文件描述符的值已经被使用,dup2会关闭掉后进行复制。
    dup和dup2 不会复制文件表,只是文件描述符的复制

    移动文件的偏移量(文件指针)的函数是lseek,fseek底层调用的就是lseek.
      函数的手册查看方式:第一看参数,第二看返回值,第三看函数的功能。
      fcntl函数:
      int fcntl(int fd,int cmd,...)
      cmd常用的有:
      F_DUPFD - 复制文件描述符,和dup2不同的是不会强行关闭已经使用的文件描述符
      F_SETFL/F_GETFL - 获取/设置文件状态标记
      状态标记和open函数呼应,分为三类:
       创建标记 、 权限标记 、 状态标记
      创建标记不会被获取,也不能设置
      权限标记可以被获取,不能被设置
      状态标记都可以(O_APPEDN)
      关于文件锁的标记:F_SETLK/F_SETLKW/F_GETLK 

    经验:
      设置状态的时候用 位或| , 判断是否存在用 位与&
    文件锁的机制和使用
      程序可以启动多进程/多线程进行代码的同时运行(并行),因此 可能出现多个进程/线程同时读写相同文件。
    两个进程 同时读 (可以)
    两个进程 一读一写 (不可以,会导致脏数据)
    两个进程 同时写 (不可行)
      如果进程1读,进程2 可读,不可写
      如果进程1写,进程2 不可读,也不可写
      读写锁解决了这个问题
       读写锁内部维护两把锁,一把读锁,一把写锁。
       读锁 是 共享锁,允许其他进程读,但不允许写
       写锁 是 独占锁,不允许其他进程读写

    文件锁是针对文件的某一部分锁定,而不是锁定整个文件。(粒度)
      Linux/Unix提供的文件锁:
       使用fcntl函数加锁,cmd使用F_SETLK/F_SETLKW加锁。C语言用结构体flock代表文件锁:
       struct flock{
         short l_type; // 锁的类型
         short l_whence;// 锁的起始位置的参照点
         int l_start;// 锁的起始位置
         int l_len;// 锁定的长度
         pid_t l_pid;// 加锁的进程id(只有GETLK有效)
       };
      l_type有三种:F_RDLCK/F_WRLCK/F_UNLCK(释放锁)
      l_whence和l_start 联合可以确定锁定的开始位置,l_len决定了锁定的长度。
      l_pid 一般给 -1 即可。
    cmd的值:
      F_SETLK - 加锁(锁的类型是F_UNLCK时解锁)
      F_SETLKW - 加锁
      区别:
       F_SETLK加锁时,非阻塞,如果锁加不上,直接返回-1;F_SETLKW加锁时,阻塞,如果锁加不上,等待

      F_GETLK - 测试一个锁能不能加上(不是取锁)

      文件锁只是在进程中做了锁定的标识,并 没有真正的锁定文件,因此文件锁无法限定对文件的读写操作。
      文件锁的用法 应该是和read/write结合使用。就是:凡是调用read之前 上读锁,调用write之前上 写锁,这样才能有效果。(fcntl(F_SETLK)函数不会锁定任何东西,但可以与另一个fcntl(F_SETLK) 呼应)

      F_GETLK - 测试一个锁能不能加上(不是取锁)
      如果能加,不真正加锁,把锁的类型改为F_UNLCK返回,如果不能加锁,返回当前正在使用的锁(原因),并改变pid的值为正在使用的锁的PID。
      判断锁能否加上的条件 是 : pid 是否 = -1
    一些文件相关的函数:
      stat/fstat 可以取得文件相关状态(ls -l)
      stat 不需要open
      C语言关于时间的表示方法:
       1 秒差 time_t 和1970年1月1日 0点0分0秒的秒差
       2 结构体 struct tm {年/月/日/时/分/秒}
       ctime 可以把 time_t 显示成字符串
      access 函数可以 判断文件是否存在

  • 相关阅读:
    IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !
    分布式任务调度平台 → XXL-JOB 实战
    JAVA
    Spring boot
    WebStorm如何去掉参数提示?
    JAVA
    redis tools
    解Bug之路-Nginx 502 Bad Gateway(转发)
    Apache Drill – JDBC Interface & Custom Function
    Apache Drill – Querying Complex Data & Data Definition Statements & Querying Data
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3771135.html
Copyright © 2020-2023  润新知