Ale*_*nov 5 debian posix python-2.7
我在 Debian GNU/Linux 8 (jessie) 64 位下使用 Python 2.7.9。我只是尝试通过调用os.chflags(path, mode). 在 Python 文档中,有一篇关于os接口的文章说该方法在Unix 中可用,但不适用于 Linux。Python 总是抛出:
Traceback (most recent call last):
File "/home/lexer/py/epam/tests/main.py", line 43, in <module>
os.chflags(path_to_file(file_name), stat.SF_NOUNLINK)
AttributeError: 'module' object has no attribute 'chflags'
Run Code Online (Sandbox Code Playgroud)
很久以前就已经提出了一个问题,但我仍然无法理解为什么os.chflags()不执行chattr命令的工作。有人能详细说明一下吗?
Linux 不提供chflags系统调用,因此 Python 不提供 wrapper os.chflags()。
该chattr命令使用代码 ( e2fsprogs-1.42.13's lib/e2p/fsetflags.c):
fd = open (name, OPEN_FLAGS);
if (fd == -1)
return -1;
f = (int) flags;
r = ioctl (fd, EXT2_IOC_SETFLAGS, &f);
if (r == -1)
save_errno = errno;
close (fd);
Run Code Online (Sandbox Code Playgroud)
为文件设置扩展属性,因此如果将其移植到 Python(并使用一些 C 来提取EXT2_IOC_SETFLAGSfrom的值ext2fs/ext2_fs.h),您可以执行以下操作:
#!/usr/bin/python2
import fcntl
import os
import struct
# Taken from ext2fs/ext2_fs.h.
EXT2_IMMUTABLE_FL = 0x00000010
EXT2_IOC_SETFLAGS = 0x40086602
fd = os.open('/var/tmp/testfile', os.O_RDWR)
f = struct.pack('i', EXT2_IMMUTABLE_FL)
fcntl.ioctl(fd, EXT2_IOC_SETFLAGS, f);
os.close(fd)
Run Code Online (Sandbox Code Playgroud)
等等:
[tim@passepartout ~]$ lsattr /var/tmp/testfile
----i----------- /var/tmp/testfile
[tim@passepartout ~]$
Run Code Online (Sandbox Code Playgroud)
但是出于所有实际目的,chattr(1)作为子进程执行可能比将上面的概念证明变成无需维护即可可靠运行的东西要谨慎得多。
| 归档时间: |
|
| 查看次数: |
2199 次 |
| 最近记录: |