本帖最后由 dt3tc 于 2019-11-30 12:06 编辑
已经 用chmod 设置了000权限位,文件属主root,但是 以普通用户 调用C语言stat()函数 仍然能 获取 该文件各属性,没有报EACCES错误#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
int main() {
struct stat buf;
char *filename="./test";
if(stat(filename, &buf)==-1){
switch(errno){
case ENOENT:
printf("file isn't exist.");
break;
case ENOTDIR:
printf("the directory contain the file isn't directory.");
break;
case ELOOP:
printf("too much symbol link.");
break;
case EFAULT:
printf("the memory space pointed is invalid.");
break;
case EACCES:
printf("access is refused.");
break;
case ENOMEM:
printf("core memory not enough.");
break;
case ENAMETOOLONG:
printf("filename too long.");
break;
default:
printf("other error.");
};
putchar('\n');
}
struct tm* c = localtime(&buf.st_atime); //struct stat* file_message
printf("last access time is %2d月 %2d %02d:%02d\n", c->tm_mon+1, c->tm_mday, c->tm_hour, c->tm_min);
printf("last access time is %s\n", asctime(c));
return 0;
}
谢谢
https://i.loli.net/2019/11/30/4MSGPFOaWLHiDoV.jpg
本帖最后由 jackz007 于 2019-11-30 14:30 编辑
不可能吧,比如,假设文件路径是 "/home/userx/abc/file.dat" 那么,子目录 "/home/userx/abc" 的属主应该是 root,权限应该是 0733,文件 "/home/userx/abc/file.dat" 的属主应该是 root,权限应该是 0755。用普通用户身份,在 "/home/userx/abc/" 路径以外运行你写的程序。再试试?
因为在 linux 文件体系中,fopen()、fread()、fwite() 等函数读写的是文件内容,这些东西直接受文件属主和权限的控制,stat() 访问文件实际上读取的是子目录的内容,自然受到子目录的属主及权限的控制。
|