由于chmod命令的一般使用格式为:
chmod u+x filename
所以本程序的编写可以按照chmod命令的格式,文件权限的获取、中间参数部分的解析以及权限的汇总、以及文件权限的更改这三个部分来实现。以下是三个部分的分析:
1、要想得到文件的权限,可以通过使用stat函数就可以实现。该函数的原型为:
#include <sys/stat.h> #include <unistd.h> int stat(const char *file_name, struct stat *buf);
当然,在这里就需要知道stat结构体是如何声明的。其声明为:
struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号 off_t st_size; //文件字节数(文件大小) unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小) unsigned long st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性) };
在这里只需要使用st_mode这一个字段而已。st_mode中就包含该文件的所有权限。为了完成第一部分的相关功能,声明的函数的原型为:
mode_t get_file_mode(const char *path);
2、由于文件的权限分为文件拥有者、文件同属组以及其他用户这三种类别。所以也需要按照三种不同的情况来处理。当然为了减少代码的编写,可以事先将九种权限实现存放于一个二维数组中。
mode_t mode[3][3]={{S_IRUSR , S_IWUSR , S_IXUSR} , {S_IRGRP , S_IWGRP , S_IXGRP} , {S_IROTH , S_IWOTH , S_IXOTH}};
然后,就可以很简单的得到中间参数做带便的权限。那么这个问题就算解决。当然了,为了解决这个问题,需要编写一个函数来实现,函数的原型为:
mode_t all_file_access(mode_t access , const char *argument);
3、其实到这里这个程序就可以说基本完成了,在这里只需要简单的汇总以上两部分,再简单的调用一个chmod函数就可以实现文件权限的更改。chmod函数原型为:
#include <sys/ctypes.h> #include <sys/stat.h> int chmod(const char *path, mode_t mode)
好了,以上就是实现自己的chmod命令的一些思路,下面的就是自己chmod命令的全部源代码:
#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <unistd.h> mode_t get_file_mode(const char *path) { struct stat buffer; if(stat(path , &buffer) == -1) { printf("The function stat error\n"); perror("stat error"); return (mode_t)0; } return buffer.st_mode; } mode_t all_file_access(mode_t access , const char *argument) { mode_t mode[3][3] = {{S_IRUSR , S_IWUSR , S_IXUSR} , {S_IRGRP , S_IWGRP , S_IXGRP} , {S_IROTH , S_IWOTH , S_IXOTH}}; int user; int user_access; mode_t user_mode; switch(argument[0]) { case ‘U‘: case ‘u‘: user = 0; break; case ‘g‘: case ‘G‘: user = 1; break; case ‘o‘: case ‘O‘: user = 2; break; default: printf("argument error !"); break; } switch(argument[2]) { case ‘r‘: case ‘R‘: user_access = 0; break; case ‘w‘: case ‘W‘: user_access = 1; break; case ‘x‘: case ‘X‘: user_access = 2; } user_mode = mode[user][user_access]; if(argument[1] == ‘+‘) return access | user_mode; return access ^ user_mode; } int my_chmod_function(const char *path , const char *argument) { mode_t mode; mode = all_file_access(get_file_mode(path) , argument); if(chmod(path , mode) == -1) { printf("Change file access failed !\n"); perror("Change file access failed "); return -1; } return 0; } int main(int argc , char **argv) { if(my_chmod_function(argv[2] , argv[1]) == -1) { printf("Access change failed !\n"); perror("Access change failed !"); return -1; } return 0; }
运行的结果为:
时间: 2024-10-13 11:17:39