利用Linux的chmod函数,制作简版mychmod函数

这两天一直再看《Linux C编程实战》,有一个实例,是在Linux下面调用chmod函数实现自己的简化版mychmod

首先来看chmod的函数原型,可通过Linux终端输入命令查到查到

man 2 chmod
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

chmod/fchmod的区别在于chmod以文件名作为第一个参数,fchmod以文件描述作为第一个参数。参数的mode有如下组合

S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限

权限更改成功返回0,失败返回-1,错误代码存于系统预定义变量errno中。

我们可以通过函数调用,实现这样的命令。

chmod 777 text.txt

程序如下:

 

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char * *argv) {
    int mode; // 权限
    int mode_u; // 所有者的权限
    int mode_g; // 所属组的权限
    int mode_o; // 其他用户的权限
    char * path;
    /*检查参数个数的合法性*/
    if (argc & lt; 3) {
        printf("%s n", argv[0]);
        exit(0);
    }
    /*获取命令行参数*/
    mode = atoi(argv[1]);
    if (mode & gt; 777 || mode & lt; 0) {
        printf("mode num error!n");
        exit(0);
    }
    mode_u = mode / 100;
    mode_g = (mode - (mode_u * 100)) / 10;
    mode_o = mode - (mode_u * 100) - (mode_g * 10);
    mode = (mode_u * 8 * 8) + (mode_g * 8) + mode_o; // 八进制转换
    path = argv[2];
    if (chmod(path, mode) == -1) {
        perror("chmod error");
        exit(1);
    }
    return 0;
}

通过上面的代码编译之后,我们就能够使用我们所写的程序对文件的权限进行更改。

如文件名为mychmod.c,编译后为mychmod,在相同目录下面有一个文件为test.txt。

我们先通过

ls -l

命令查看test.txt的文件权限,通过命令

./mychmod 777 test.txt

赋予test.txt各项权限了,其中777可改。

课后还有一道作业,就是使自己编写的mychmod也支持像 u-x,g+r,o+w的参数模式,我在慢慢整理一下,看看能不能弄懂。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>