我需要找到谁使用python(posix / linux)锁定文件。目前我使用这种方法:
flk = struct.pack('hhqql', fcntl.F_WRLCK, 0, 0, 0, 0)
flk = struct.unpack('hhqql', fcntl.fcntl(self.__file, fcntl.F_GETLK , flk))
if flk[0] == fcntl.F_UNLCK:
# file is unlocked ...
else:
pid = flk[4]
此解决方案不依赖于架构。传递给fcntl的结构包含off_t或pid_t等字段。我无法对这些类型的大小做出假设。
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) */
...
};
还有其他方法可以找到PID吗?或者也许是off_t和pid_t的大小?解决方案必须在不同架构之间完全可移植。
修改 我决定使用 lsof 程序,如下所示。另一种选择是解析/ proc / locks文件。
答案 0 :(得分:4)
也许你可以尝试使用外部程序lsof来做到这一点?
Lsof revision 4.85 lists on its standard output file information about files opened by processes for the following UNIX dialects: AIX 5.3 Apple Darwin 9 and Mac OS X 10.[56] FreeBSD 4.9 and 6.4 for x86-based systems FreeBSD 8.[02] and 9.0 for AMD64-based systems Linux 2.1.72 and above for x86-based systems Solaris 9, 10 and 11
答案 1 :(得分:0)
我之前使用的是'hhllh'
,因为我认为它会跨平台最贴切地映射到off_t
。但最终我决定使用'hhqqh'
,它适用于32位和64位系统。
我对此解决方案感到惊讶,但我正在查看的32位框似乎是bits/fcntl.h
创建flock
结构off64_t
,除非系统已经定义__USE_FILE_OFFSET64
(在这种情况下,它只使用常规'ol off_t
),因此l_start
和l_len
的大小似乎总是8(python struct format char 'q'
是long long
)。
这可能不是完全可移植的,我不能说所有现代的32位系统都会这样做,但现在对我来说已经足够了 - 所以我想我会提到它以防其他人(比如我自己)宁愿不必执行另一个进程并做一堆字符串解析,YMMV。此外,如果我误解(或解释不清楚)为什么这个格式字符串似乎在两个平台上都有效 - 也许有人可以纠正我?