记录锁
来源:互联网 发布:辐射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)由fork产生的子进程不继承父进程所设置的锁。
3)在exec后新程序可以继承原执行程序的锁。如果在exec中关闭该描述符,讲释放相应文件上的所有的锁。在文件尾端加锁
(unix环境高级变成)P398建议性锁和强制性锁
建议性锁就是文件被锁住之后,别的进程加锁会失败,但是还是有权读写
强制性锁就是文件被锁住后,别的进程无权读写
一般情况下都是建议性锁,强制性锁必须要内核支持,并在系统中打开该配置
0 0
- 记录锁
- 记录锁
- 记录锁
- 记录锁
- 记录锁
- 记录锁
- 记录锁
- 记录锁
- 文件锁 记录锁
- 文件锁 记录锁
- 文件锁 记录锁
- 文件锁 记录锁
- oracle 查询 锁记录
- 记录锁详解
- 学习记录锁
- 记录锁 详解
- APUE_记录锁
- Android 锁屏记录
- java提高篇(十四)-----字符串
- Scala学习(需要查看)
- python编码的一些要点
- Servlet--取得初始化配置信息
- 变态最大值
- 记录锁
- Hive启动时,报错Relative path in absolute URI: ${system:java.io.tmpdir}
- 网络代理:HTTP调试工具Charles Proxy用法详解
- 初谈一Dagger2
- ARM汇编伪指令
- Jenkins2 不显示测试报告解决办法(重启后依然生效)
- 对捕获的 不记录到$1,$2,$3中
- 局部刷新,全局刷新
- c——表达式