我需要将来自文件的基本文件权限与来自输入的文件权限进行比较。输入应保存在 中argv[1]
,文件中的权限信息存储在经典struct stat stat_buf
中,特别是在stat_buf.st_mode
字段中。
执行的一个例子是./program 775
. 那么程序必须说这是stat_buf.st_mode
代码内部某些文件的相同权限。但我所知道的是,of 的格式st_mode
很棘手,因为它必须被读取为八进制,然后将其转换为 int,等等。如何比较没有问题?
我需要将来自文件的基本文件权限与来自输入的文件权限进行比较。输入应保存在 中argv[1]
,文件中的权限信息存储在经典struct stat stat_buf
中,特别是在stat_buf.st_mode
字段中。
执行的一个例子是./program 775
. 那么程序必须说这是stat_buf.st_mode
代码内部某些文件的相同权限。但我所知道的是,of 的格式st_mode
很棘手,因为它必须被读取为八进制,然后将其转换为 int,等等。如何比较没有问题?
我的方法是构建一个名为的函数,该函数以八进制模式oct
将其stat_buf.st_mode
复制到缓冲区,然后再次将其复制到其他缓冲区以消除我不想要的信息(前 3 个数字),最后使用该strtol
函数获取十进制数,将其与输入进行比较。
int oct(mode_t num) {
int i;
char buffer[7], buffer2[4];
snprintf(buffer, 8, "%o", num);
for(i = 0; i < strlen(buffer2); i++)
buffer2[i] = buffer[i + 2];
return strtol(buffer2, NULL, 10);
}
以及如何测试:
int main() {
int mode1, mode2;
struct stat stat_buf;
stat("/home/user/myfile", &stat_buf);
mode1 = atoi(argv[1]);
mode2 = oct(stat_buf.st_mode);
printf("%d %d\n", mode1, mode2);
return 0;
}
示例:执行./program 775
给定作为输出775 775
的格式
st_mode
很棘手,因为它必须被读取为八进制 [...]
不是特别。只需使用strtoul()
适当的底座 (8):
unsigned long mode = strtoul(argv[1], NULL, 8);
if (statbuf.st_mode == mode) {
// permissions match
}