linux 判断文件被其他进程占用

客户需要将转码器中电视直播频道的hls切片转存出来,在拷贝文件时,需要判断该切片文件是否正在被写入,否则拷贝出来的切片文件不完整。

linux下程序fuser有这个功能,源码在psmisc包里,地址:https://gitlab.com/psmisc/psmisc

fuser功能很强大,可以查找文件,目录,网络端口等,我们只用到文件部分

原理是遍历/proc下的进程目录,和fd中的描述符做比较

关键函数如下:

 1 static void
 2 check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head,
 3       struct inode_list *ino_head, const uid_t uid, const char access,
 4       dev_t netdev)
 5 {
 6     char *dirpath, *filepath;
 7     DIR *dirp;
 8     struct dirent *direntry;
 9     struct inode_list *ino_tmp;
10     struct device_list *dev_tmp;
11     struct stat st, lst;
12
13     if ((dirpath = malloc(MAX_PATHNAME)) == NULL)
14         return;
15     if ((filepath = malloc(MAX_PATHNAME)) == NULL)
16         return;
17
18     snprintf(dirpath, MAX_PATHNAME, "/proc/%d/%s", pid, dirname);
19     if ((dirp = opendir(dirpath)) == NULL)
20         return;
21     while ((direntry = readdir(dirp)) != NULL) {
22         if (direntry->d_name[0] < ‘0‘ || direntry->d_name[0] > ‘9‘)
23             continue;
24
25         snprintf(filepath, MAX_PATHNAME, "/proc/%d/%s/%s",
26              pid, dirname, direntry->d_name);
27         if (stat(filepath, &st) != 0) {
28             fprintf(stderr, "Cannot stat file %s: %s\n",
29                 filepath, strerror(errno));
30         }
31         else
32         {
33             for (dev_tmp = dev_head; dev_tmp != NULL;
34                  dev_tmp = dev_tmp->next) {
35                 if (st.st_dev == dev_tmp->device) {
36                     if (access == ACCESS_FILE
37                         && (lstat(filepath, &lst) == 0)
38                         && (lst.st_mode & S_IWUSR)) {
39                         add_matched_proc(dev_tmp->name,
40                                  pid, uid,
41                                  ACCESS_FILEWR |
42                                  access);
43                     } else {
44                         add_matched_proc(dev_tmp->name,
45                                  pid, uid,
46                                  access);
47                     }
48                 }
49             }
50             for (ino_tmp = ino_head; ino_tmp != NULL;
51                  ino_tmp = ino_tmp->next) {
52                 if (st.st_dev == ino_tmp->device
53                     && st.st_ino == ino_tmp->inode) {
54                     if (access == ACCESS_FILE
55                         && (lstat(filepath, &lst) == 0)
56                         && (lst.st_mode & S_IWUSR)) {
57                         add_matched_proc(ino_tmp->name,
58                                  pid, uid,
59                                  ACCESS_FILEWR |
60                                  access);
61                     } else {
62                         add_matched_proc(ino_tmp->name,
63                                  pid, uid,
64                                  access);
65                     }
66                 }
67             }
68         }
69     }            /* while fd_dent */
70     closedir(dirp);
71 }

运行结果:

ps:

同学们测试时如使用vi打开文件,但是fuser未显示文件被占用,原因如下:

时间: 2024-10-29 04:47:41

linux 判断文件被其他进程占用的相关文章

linux查文件被哪些程序占用—fuser和lsof的使用

fuser 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件.目录.设备或套接字; lsof MTR fuser命令 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件.目录.设备或套接字;语法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目录/套接字/设备 ...说明:fuser命令列出了本地进程的进程号,那些本地进程使用File参数指定的本地或远程文件.对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程.每个

Linux查看端口被那个进程占用?

1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料 linux,windows xshell 方法/步骤 [步骤一]lsof -i lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具.以root用户来执行lsof -i命令,如下图   [步骤二]lsof -i:端口号 lsof -i:端口号,用于查看某一端口的占用情况,比如查看22号端口使用情况,l

Linux下如何查看哪些进程占用的CPU内存资源最多

linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用内存资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head 命令组合解析(针对CPU的,MEN也同样道理): ps aux|head -1;ps aux|grep -v PID|sort -rn -k

使用C#如何查看哪些文件被哪些进程占用了

string fileName = @"C:\Target\Plugins\print\NLog.dll"; //要检查被那个进程占用的文件 Process tool = new Process(); tool.StartInfo.FileName = @"C:\soft\Handle\handle64.exe"; tool.StartInfo.Arguments = fileName + " /accepteula"; tool.StartIn

linux查看端口被哪个进程占用

查看那个进程占用了xxx端口 lsof -i:xxx 查看进程号为xxx的进程在哪里 ps -ef|grep xxx 转自: http://zhidao.baidu.com/link?url=_Dmo29rxjQDTyZU_y6iCOF17JQWQc5LxBDHojuvP5O087FgIjbLovE__24JwNrs3N-qc51TO4fXzVV_No6dBR_

C++ linux 判断文件是否存在

1,文件夹是否存在: 通过判断文件夹是否成功打开 来判断 DIR *dir;      if  ((dir = opendir(path)) == NULL)      {          return  0;      }     closedir(dir); 2,文件是否存在: #include<unistd.h>定义函数    int access(const char * pathname, int mode); 否存: R_OK:只是检测当前用户是否具有可读权限: W_OK:类似R

lsof 查看文件被哪个进程占用

lsof 是什么意思? 答: list open files 查看某个文件被哪些进程在读写 lsof 文件名 查看某个进程打开了哪些文件lsof –c 进程名lsof –p 进程号 lsof用法小全 lsof +d /usr/local/ 显示目录下被进程开启的文件lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长 lsof abc.txt 显示开启文件abc.txt的进程lsof -i :22 知道22端口现在运行什么程序lsof -c nsd 显示nsd进程现在打

linux 判断文件夹或文件是否存在

文件夹不存在则创建 if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi 文件存在则删除 if [ ! -f "/data/filename" ];then echo "文件不存在" else rm -d /data/filename fi 判断文件夹是否存在 if [ -d "/data/" ];then echo "文件夹存在

windows 查看文件被哪个进程占用

经常当我们删除文件时,有时会提示[操作无法完成,因为文件已在另一个程序中打开,请关闭该文件并重试],到底是哪些程序呢? 有时候一个一个找真不是办法,已经被这个问题折磨很久了,今天下决心要把它解决,找到办法了.如果系统是win7,可以这么做: 在开始菜单中的搜索框内输入“资源监视器”,回车,打开“资源监视器”. 看下图,在“资源监视器”界面中,点击第二个选项卡“CPU”.在“关联的句柄”右侧搜索框内输入文件名称,点击右侧下拉箭头,就可以查看该文件被那几个程序占用了. 选中程序,右击选择结束进程.