Linux实验三 编写程序实现以下功能: 1.输入文件名称,能够判断文件类型,判断实际用户对该文件具有哪些存取权限; 2.要求打印出文件类型信息,inode节点编号,链接数目,用户id,组id,文件大小信息; 3.修改文件的权限为当前用户读写,组内用户读写,组外用户无权限。
时间: 2024-11-13 09:24:50 浏览: 8
在Linux实验三中,你需要使用C语言结合标准库中的`stat`、`access`和`chmod`等函数来完成对文件的分析和权限更改。以下是一个简单的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
// 判断文件类型
enumFileType {
FILE_TYPE_UNKNOWN,
FILE_TYPE_REGULAR,
FILE_TYPE_DIR,
FILE_TYPE_SYMLINK,
};
enumFileType getFileType(const char* filename) {
struct stat stbuf;
int ret = stat(filename, &stbuf);
if (ret != 0) {
perror("Stat failed");
return FILE_TYPE_UNKNOWN;
}
switch (stbuf.st_mode & S_IFMT) {
case S_IFREG:
return FILE_TYPE_REGULAR;
case S_IFDIR:
return FILE_TYPE_DIR;
case S_IFLNK:
return FILE_TYPE_SYMLINK;
default:
return FILE_TYPE_UNKNOWN;
}
}
// 获取文件权限信息
void printPermissions(const char* filename) {
struct stat stbuf;
int ret = stat(filename, &stbuf);
if (ret != 0) {
perror("Stat failed");
return;
}
printf("File Type: %s\n", getFileType(filename) == FILE_TYPE_REGULAR ? "Regular File" : getFileType(filename) == FILE_TYPE_DIR ? "Directory" : "Symbolic Link");
printf("Inode Node ID: %ld\n", stbuf.st_ino);
printf("Links: %lu\n", stbuf.st_nlink);
printf("User ID: %d\n", stbuf.st_uid);
printf("Group ID: %d\n", stbuf.st_gid);
printf("Size: %lld bytes\n", stbuf.st_size);
}
// 修改文件权限
void changePermissions(const char* filename) {
mode_t new_mask = S_IRUSR | S_IWUSR | S_IXUSR |
S_IRGRP | S_IWGRP | S_IXGRP; // 允许当前用户和组内的用户读写
if (chmod(filename, new_mask) != 0) {
perror("Failed to change permissions");
} else {
printf("Permissions changed successfully.\n");
}
}
int main() {
char filename[100];
printf("Enter file name: ");
fgets(filename, sizeof(filename), stdin);
filename[strcspn(filename, "\n")] = '\0';
printPermissions(filename);
changePermissions(filename);
return 0;
}
```
这个程序会提示用户输入文件名,然后获取并打印文件类型、inode信息、链接数、用户ID、组ID和文件大小。接着,它会尝试将文件权限改为允许当前用户及组内的用户读写。
请注意,实际运行时可能需要处理异常情况,比如文件不存在、路径错误等。此外,对于敏感操作,如修改权限,需要谨慎处理,确保程序安全。
阅读全文