Dave Asked: 2013-07-03 19:01:46 +0800 CST2013-07-03 19:01:46 +0800 CST 2013-07-03 19:01:46 +0800 CST Linux:判断文件是否使用 O_SYNC 打开 772 有没有办法判断进程是否打开了带有 O_SYNC 标志的文件?我在想 lsof 可能能够做到这一点,但找不到办法。 lsof 2 个回答 Voted Best Answer dawud 2013-07-03T23:15:58+08:002013-07-03T23:15:58+08:00 这可以使用systemtap脚本来完成。这个取自这里,完全符合您的要求: # list_flags.stp # Copyright (C) 2007 Red Hat, Inc., Eugene Teo # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # %{ #include <linux/file.h> %} function list_flags:long (pid:long, fd:long) %{ struct task_struct *p; struct list_head *_p, *_n; list_for_each_safe(_p, _n, ¤t->tasks) { p = list_entry(_p, struct task_struct, tasks); if (p->pid == (int)THIS->pid) { struct file *filp; struct files_struct *files = p->files; spin_lock(&files->file_lock); filp = fcheck_files(files, (int)THIS->fd); THIS->__retvalue = (!filp ? -1 : filp->f_flags); spin_unlock(&files->file_lock); break; } } %} probe begin { flag_str = ( (flags = list_flags($1, $2)) ? _sys_open_flag_str(flags) : "???"); printf("pid: %d, fd: %d: %s\n", $1, $2, flag_str) exit() } 参考链接中提供了两个有关如何使用它的示例,我将在此处复制其中一个示例: [eteo@kerndev ~]$ stap -vg list_flags.stp $$ 3 2>&1 | grep O_DIRECT pid: 30830, fd: 3: O_RDONLY|O_APPEND|O_CREAT|O_DIRECT|O_DIRECTORY|O_EXCL|O_LARGEFILE|O_NOATIME|O_NOCTTY|O_NOFOLLOW|O_NONBLOCK|O_SYNC|O_TRUNC 您可以根据自己的目的替换O_DIRECT为O_SYNC。 更多参考资料: SystemTap 初学者指南 SystemTap Tapset 参考 ###### xorinox 2022-07-18T20:11:14+08:002022-07-18T20:11:14+08:00 lsof +fg /path将显示用于打开文件的标志作为路径提供。可以在 man lsof 中找到返回的标志的简短描述。
这可以使用
systemtap
脚本来完成。这个取自这里,完全符合您的要求:参考链接中提供了两个有关如何使用它的示例,我将在此处复制其中一个示例:
您可以根据自己的目的替换
O_DIRECT
为O_SYNC
。更多参考资料:
######
lsof +fg /path
将显示用于打开文件的标志作为路径提供。可以在 man lsof 中找到返回的标志的简短描述。