如何实现自己的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;
}

运行的结果为:

如何实现自己的chmod命令,布布扣,bubuko.com

时间: 2024-10-13 11:17:39

如何实现自己的chmod命令的相关文章

linux chmod命令(转)

chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作.可执行权限表示允许将该文件作为一个程序执行.文件被创建时,文件所有者自动拥有对该文件的读.写和可

Linux | chmod命令

一.权限说明 -rw-r–r– :这是某个文件的权限位. 我们从这个权限位开始说明: 第一个横杠:指定文件类型,表示该文件是一个普通文件.(所创建的文件绝大多数都是普通文件或符号链接文件). 除去第一个横杆,一共9个字符,用来设置用户访问文件的权限: rw-:前三位,文件属主可读.写 r–:中间三位,组用户可读 r–:最后三位,其他用户只可读 r 读权限 w 写/更改权限 x 执行该脚本或程序的权限 下面多举几个权限命令: r-- --- --- 文文件属主可读,但不能写或执行 r-- r--

【转】每天一个linux命令(27):linux chmod命令

原文网址:http://www.cnblogs.com/peida/archive/2012/11/29/2794010.html chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读

常用简单Chown命令和Chmod命令

linux下使用ls -la可以查看当前目录下的文件详细信息 文件的权限组成格式是: 文件属性  当前用户权限  用户所属用户组权限  其他用户权限   链接数   用户  用户组  大小 时间戳 d                 rwx                        rw-                          r--                 1          ha       ha       679    6月 一般来说从其他用户的目录下使用cp

老男孩教育每日一题-2017年5月2日-Linux系统中,不小心把chmod命令的权限弄没了,怎么解决?

老男孩教育每日一题-2017年5月2日-Linux系统中,chmod命令没有执行权限(x权限)或者chmod命令文件的权限为000,怎么解决? 解决方法有两种: 方法一: [[email protected] bin]# cp cp /oldboy/chmod.new (此时复制cp命令文件命名叫chmod.new,此时chmod.new文件有就x的权限,但chmod.new不具备有chmod命令的共功能) [[email protected] bin]# cd /oldboy/ [[email

linux命令--chmod命令&chgrp命令&chown命令

chmod命令是用来更改文件或者文件夹权限的命令 使用方法为 chmod [who] [+ | - | =] [mode] 文件名 其中mode的方法如下: 数字与字符对应关系如下: r=4,w=2,x=1若要rwx属性则4+2+1=7若要rw-属性则4+2=6:若要r-x属性则4+1=7. 其中who权限组的关系如下: u :目录或者文件的当前的用户g :目录或者文件的当前的群组o :除了目录或者文件的当前用户或群组之外的用户或者群组a :所有的用户及群组 例子1  表示给当前用户,当前群组增

chmod 命令参考

-rw------- (600) -- 只有属主有读写权限. -rw-r--r-- (644) -- 只有属主有读写权限:而属组用户和其他用户只有读权限. -rwx------ (700) -- 只有属主有读.写.执行权限. -rwxr-xr-x (755) -- 属主有读.写.执行权限:而属组用户和其他用户只有读.执行权限. -rwx--x--x (711) -- 属主有读.写.执行权限:而属组用户和其他用户只有执行权限. -rw-rw-rw- (666) -- 所有用户都有文件读.写权限.这

每天一个linux命令(27):linux chmod命令

chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作.可执行权限表示允许将该文件作为一个程序执行.文件被创建时,文件所有者自动拥有对该文件的读.写和可

Linux chmod命令用法

chmod----改变一个或多个文件的存取模式(mode) chmod [options] mode files 只能文件属主或特权用户才能使用该功能来改变文件存取模式.mode可以是数字形式或以who opcode permission形式表示.who是可选的,默认是a(所有用户).只能选择一个opcode(操作码).可指定多个mode,以逗号分开. options: -c,--changes 只输出被改变文件的信息 -f,--silent,--quiet 当chmod不能改变文件模式时,不通