综合例子
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<dirent.h>
#include<stdlib.h>
typedefenum {
false = 0, true = 1
} bool;
voidprintFileInfo(struct stat* buf) {
bool userall = false;
printf("文件权限是:%o. 详细信息如下:\n", (buf->st_mode& 0x0fff));
if (buf->st_mode& S_IRWXU) {
userall = true;
printf("所有者拥有读写执行权限\n");
}
if (buf->st_mode& S_IRWXG) {
printf("用户组拥有读写执行权限\n");
}
if (buf->st_mode& S_IRWXO) {
printf("其他人拥有读写执行权限\n");
}
if (userall) {
if (buf->st_mode& S_IRUSR) {
printf("所有者拥有读权限\n");
}
if (buf->st_mode& S_IWUSR) {
printf("所有者拥有写权限\n");
}
}
if (buf->st_mode& S_IFREG) {
printf("文件是一个普通文件\n");
}
if (buf->st_mode& S_ISUID) {
printf("文件设置了SUID权限\n");
}
if (buf->st_mode& S_ISGID) {
printf("文件设置了GUID权限\n");
}
printf("UID=%d\n", buf->st_uid);
printf("GID=%d\n", buf->st_gid);
printf("占用block=%ld\n", buf->st_blocks);
printf("block大小=%ld\n", buf->st_blksize);
printf("最后访问时间=%ld\n", buf->st_atim.tv_sec);
printf("最后状态更新时间=%ld\n", buf->st_ctim.tv_sec);
printf("最后修改时间=%ld\n", buf->st_mtim.tv_sec);
}
intOpenFile(constchar *fpath) {
unlink(fpath);
int f = open(fpath, O_RDWR);
if (f == -1) {
f = creat(fpath, S_IWUSR | S_IRUSR);
if (f != -1) {
printf("创建一个文件\n");
} else {
printf("无法创建文件\n");
return -1;
}
} else {
printf("文件打开成功\n");
}
return f;
}
voidscan_dir(constchar* dir, int depth) {
DIR *dp;
struct dirent* entry;
if ((dp = opendir(dir)) == NULL) {
printf("无法打开目录:%s\n", dir);
return;
}
struct stat statbuf;
chdir(dir);
while ((entry = readdir(dp)) != NULL) {
constchar* name = entry->d_name;
lstat(name, &statbuf);
if (S_IFDIR & statbuf.st_mode) {
if (strcmp(".", entry->d_name) == 0
|| strcmp("..", entry->d_name) == 0) {
continue;
}
printf("%*s%s:%o\n", depth, "", entry->d_name,
(statbuf.st_mode& 0x0fff));
scan_dir(entry->d_name, depth + 4);
} else {
printf("%*s%s:%o\n", depth, "", entry->d_name,
(statbuf.st_mode& 0x0fff));
}
}
chdir("..");
closedir(dp);
}
intmain() {
constchar *fpath = "test";
int f = OpenFile(fpath);
struct stat *buf = malloc(sizeof(struct stat));
fstat(f, buf);
printf("===================================================\n");
printFileInfo(buf);
printf("===================================================\n");
close(f);
sleep(1);
chmod("test", 7777);
printf("更改文件权限为7777\n");
stat("test", buf);
printf("===================================================\n");
printFileInfo(buf);
printf("===================================================\n");
free(buf);
printf("==================扫描文件夹============================\n");
scan_dir("/home", 0);
umask(0011);
mkdir("/tmp/mydir", 0777);
creat("/tmp/mydir/myfile", 0777);
printf("==================扫描文件夹==========================\n");
scan_dir("/tmp/mydir", 0);
chdir("/tmp");
unlink("mydir/myfile");
rmdir("mydir");
return 0;
}
执行结果
创建一个文件
===================================================
文件权限是:600. 详细信息如下:
所有者拥有读写执行权限
所有者拥有读权限
所有者拥有写权限
文件是一个普通文件
UID=0
GID=0
占用block=8
block大小=4096
最后访问时间=1397539372
最后状态更新时间=1397539372
最后修改时间=1397539372
===================================================
更改文件权限为7777
===================================================
文件权限是:7141. 详细信息如下:
所有者拥有读写执行权限
用户组拥有读写执行权限
其他人拥有读写执行权限
文件是一个普通文件
文件设置了SUID权限
文件设置了GUID权限
UID=0
GID=0
占用block=8
block大小=4096
最后访问时间=1397539372
最后状态更新时间=1397539373
最后修改时间=1397539372
===================================================
==================扫描文件夹============================
.bashrc:644
.bash_logout:644
.mozilla:755
extensions:755
plugins:755
.nautilus:755
metafiles:700
目录创建成功
文件创建成功
==================扫描文件夹==========================
myfile:766
文件删除成功
目录删除成功