记录锁

来源:互联网 发布:辐射4配置优化 编辑:程序博客网 时间:2024/04/29 16:56

先举一个实例:多个进程写一个文件,加写锁

int main(){    int fd = -1;    char buf[16] = {0};    fd = open(g_plugin.config_get_strval("pid_file", "./pid"), O_RDWR|O_CREAT, 0644);    if (fd < 0)    BOOT_LOG(-1, "check single failed");    //添加写锁    struct flock fl;    fl.l_type = F_WRLCK;//锁类型: F_RDLCK(加共享读锁), F_WRLCK(加独占写锁), F_UNLCK(解锁一个区域)    fl.l_whence = SEEK_SET;// l_start字段参照点: SEEK_SET(文件头), SEEK_CUR(文件当前位置), SEEK_END(文件尾)    fl.l_start = 0;//相对于l_whence字段的偏移量    fl.l_len = 0;//需要锁定的长度    fl.l_pid = getpid();//当前获得文件锁的进程标识(F_GETLK    //fcntl函数获取或者修改fd状态    //F_GETLK,判断锁是否会被排斥,如果排斥fl返回现有锁的数据    //F_SETLK,设置锁如果失败立即出错返回    //F_SETLKW,设置锁,阻塞型,成功再返回    if (fcntl(fd, F_SETLK, &fl) < 0) {        //EACCEA:文件没有访问权限, EAGAIN:资源临时不可用        if (errno == EACCES || errno == EAGAIN) {            close(fd);            BOOT_LOG(-1, "service is running");            return -2;        }        BOOT_LOG(-1, "service is running");    }    //设置文件大小为0,即清楚文件内容    if (ftruncate(fd, 0) != 0)        BOOT_LOG(-1, "check single failed");    //讲进程号写入文件中    snprintf(buf, sizeof(buf), "%d", (int)getpid());    if (write(fd, buf, strlen(buf)) == -1)        BOOT_LOG(-1, "check single failed");    return 0;}
  1. 死锁:
    如果两个进程互相等待对方持有并且不释放(锁定)的资源时,则这两个进程就处于死锁状态。
    当检测到死锁时,内核必须选择一个进程接收出错返回。

  2. 锁的隐含继承和释放
    1)当进程终止时,它所建立的锁会全部释放。当一个描述符关闭时,该进程通过这一描述符引用的文件上的任何一把锁都会释放。
    2)由fork产生的子进程不继承父进程所设置的锁。
    3)在exec后新程序可以继承原执行程序的锁。如果在exec中关闭该描述符,讲释放相应文件上的所有的锁。

  3. 在文件尾端加锁
    (unix环境高级变成)P398

  4. 建议性锁和强制性锁
    建议性锁就是文件被锁住之后,别的进程加锁会失败,但是还是有权读写
    强制性锁就是文件被锁住后,别的进程无权读写
    一般情况下都是建议性锁,强制性锁必须要内核支持,并在系统中打开该配置

0 0
原创粉丝点击