问题描述
Linux 系统下; 进程突然挂起, 经过日志调试和跟踪,最后定位为 A进程进行日志打印时,fopen() 打开文件后, 进行了lockf(iNum,F_LOCK,00) 操作, 使用文件结束后-且没有 lockf( iNum, F_ULOCK, 00 ) ; B进程 对相同文件进行读写操作时, 就会在fopen时 挂起;
需要kill A进程之后, B进程才会正常继续往下运行
lockf() 函数说明
#include <unistd.h>
int lockf(int fd, int cmd, off_t len);
fd为通过open返回的打开文件描述符。
cmd的取值为:
F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。
F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。
F_ULOCK:解锁。
F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。
len:为从文件当前位置的起始要锁住的长度。
通过函数参数的功能,可以看出lockf只支持排他锁,不支持共享锁。
命令 1 strace -p [pid] 进行跟踪
可以通过该命令 ,跟踪程序的执行情况 ,再什么地方挂起;
命令2 lsof -p [pid] 进行查看
返回: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
如果是 fopen–打开文件,则文件大小 显示在SIZE这一列;
解决办法
排查程序中 对于文件lockf() 锁定后,写完日志后 ,需要进行lockf() 进行解锁操作 ;