这两天一直再看《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 *
+ (mode_g *
+ 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的参数模式,我在慢慢整理一下,看看能不能弄懂。