Linux-实现mychmod命令

        本次编写的需求如下:

实现一个文件管理子系统

基本功能:在LINUX下编制程序,模拟实现一个文件管理子系统,要求实现文件管理的基本功能,包括:

修改/查看文件权限,命令名为mychmod(功能类似命令 chmod *** aa.txt),若输入命令为mychmod aa.txt则显示文件aa.txt的权限,若输入命令为mychmod *** aa.txt,则修改文件aa.txt,其中***表示文件权限。

        代码实现如下

#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <sys/types.h> 
#include <stdlib.h> 
#include <time.h>
// 定义mychmod函数,该函数改变一个文件的权限  
void  mychmod(char filename[],char mode[])
{
    struct stat fileStat;  
    if (stat(filename, &fileStat) < 0) {  
        printf("Error getting file status.\n");  
        return;  
    }  
     printf("Original file permissions for %s: %o\n", filename, fileStat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));  
     long new_mode = strtol(mode, NULL, 8); 
// 使用chmod函数改变文件的权限,参数为filename和new_mode  
    chmod(filename,new_mode);
   printf("File permissions for %s have been changed to: %o\n", filename, new_mode);  
}
// 定义check_mode函数,该函数检查输入的字符串是否为3位的八进制数字  
int check_mode(char mode[])
{
    int len=strlen(mode),i;
    if(len!=3)
    {
        return 0;
    }
    for(i=0;i<3;i++)
    {
        if(mode[i]<'0'||mode[i]>'7')
        {
            return 0;
        }
    }
    return 1;
}
// 定义show函数,该函数显示一个文件的权限信息  
int show(char filename[])
{
 // 定义一个struct stat类型的变量fileStat,用于存储文件的元数据信息 ,使用stat函数获取文件的元数据信息,并将结果存储在fileStat中 
    struct stat fileStat;  
    if (stat(filename, &fileStat) < 0) {  
        printf("Error getting file status.\n");  
        return;  
    }  
    printf("File permissions for %s: %o\n", filename, fileStat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));  
}
//主函数实现命令的识别和对应功能的实现
int main(int argc,char *argv[])
{
    int i;
// 检查命令行参数的数量,如果只有一个(即程序名),则输出"Invalid command."并返回0结束程序  
    if(argc==1)
    {
        printf("Invalid command.\n");
     return 0;
    }
// 如果有两个参数(除了程序名),调用show函数处理第二个参数(argv[1]) 
    if(argc==2)
    {
        show(argv[1]);
    }
// 如果命令行参数大于等于3个,先检查第一个参数是否合法(通过check_mode函数检查) 
    if(argc>=3)
    {
        if(!check_mode(argv[1])) 
        return 0;
// 对剩余的命令行参数(从第三个参数开始),调用mychmod函数处理每个参数,第一个参数作为权限模式,第二个参数作为文件名 
        for(i=2;i<argc;i++)
        {
            mychmod(argv[i],argv[1]);
        }
    }
    
    return 0;
}

        本次任务实现的是查看/修改文件的权限,在实际操作操作中,对于查询和修改功能实现没有什么大问题。但在运行时发现,在mychmod中只能单独实现一个功能。对于类似于mychmod a.txt和mychmod *** a.txt的实际操作中,发现原来的函数无法实现参数的正确传输,也就是说无法识别***是为空,导致可能把a.txt错误得设置为第二个参数。因为硬性要求,对于输入格式的规范,需要用到以上函数,不然可以通过设置一个flag来标记需要执行哪个命令。由于对C语言基本调用函数的不理解,没有正确处理问题,后来通过查阅资料才得知可以通过int main(int argc,char *argv[])实现参数的正确调用。以上面的命令为列子,若输入mychmod a.txt,那么argv[0]=mychmod,此时argc=1;argv[1]=a.txt,argc=2。也就是说最后实现的是对查看文件权限的功能。若输入的是mychmod 755  a.txt,那么argv[0]=mychmod,此时argc=1;argv[1]=755,argc=2;argv[2]=a.txt,argc=3。也就是说最后实现的是把a.txt的权限改为755。依次类推,它可以实现对多个文件的权限修改,但只能修改为同一个权限。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值