Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19899
  • 博文数量: 3
  • 博客积分: 108
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-09 18:40
文章分类
文章存档

2012年(3)

分类: LINUX

2012-10-25 20:24:41

今天操作系统上机,突然就想把Linux C编程实战重新看一遍,当然从文件系统着手,把my_chmod这个程序重新敲了一遍收获不少呀。

在进行程序设计时,可以通过chmod/fchmod函数对文件访问权限进行修改,在Shell下输入man 2 chmod 可查看chmod/fchmod的函数原型,如下:

点击(此处)折叠或打开

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

chmod/fchmod的区别在于chmod以文件名作为第一个参数,fchmod以文件描述符作为第一个参数。参数mod主要有一下几种组合。


以下为我的chmod函数,my_chmod.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5.                                     
  6. int main(int argc,char **argv)
  7. {
  8.     int mode;
  9.     int mode_u;
  10.     int mode_g;
  11.     int mode_o;
  12.     char *path;
  13.                                     
  14.     if(argc < 3){
  15.         printf("%s ",argv[0]);
  16.         exit(0);
  17.     }
  18.                                     
  19.     mode = atoi(argv[1]);
  20.     if(mode > 777 || mode < 0){
  21.         printf("mode num error!\n");
  22.         exit(0);
  23.     }
  24.     mode_u = mode / 100;
  25.     mode_g = (mode % 100) / 10;
  26.     mode_o = mode % 10;
  27.     mode = (mode_u * 8 * 8) + (mode_g * 8)+ mode_o;
  28.     path = argv[2];
  29.                                     
  30.     if(chmod(path,mode) == -1){
  31.         perror("chmod error");
  32.         exit(1);
  33.     }
  34.                                     
  35.     return 0;
  36. }
在程序中,权限更改成功返回0,失败返回-1,错误代码存于系统预定义变量errno中。

上面的程序中,atoi这个函数调用是将字符串转换成整型,例如:atoi("777")的返回值为整型的777.对于chmod函数,第二个参数一般用上面列出来的宏之间取或运算。

对于这个程序,Linux C编程实战中的取mode值的方法可能比较高效,附关键代码:

点击(此处)折叠或打开

  1. mode_u = mode / 100;
  2. mode_g = (mode - (mode_u*100)) / 10;
  3. mode_0 = mode - (mode_u * 100) - (mode_g * 10);

这节课的学习就到这吧。(未完待续)


阅读(1684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~