码迷,mamicode.com
首页 > 其他好文 > 详细

如何实现自己的chmod命令

时间:2014-08-13 00:46:24      阅读:429      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   io   文件   ar   

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

运行的结果为:

bubuko.com,布布扣

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

如何实现自己的chmod命令

标签:style   blog   http   color   使用   io   文件   ar   

原文地址:http://www.cnblogs.com/2013jiutian/p/3908668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!