首页 > 代码库 > 如何实现自己的chmod命令

如何实现自己的chmod命令

由于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;}

运行的结果为: