Linux下一些文件操作和一些简单命令的自己实现

简化版 chmod

利用chmod()函数
可以改变访问文件权限

#include<sys/types.h>
#include<sys/stat.h>
int chmod(comst char *pathname,mode_t mode);

pathname为所要改变文件名称
mode为八进制数

成功返回0,失败返回-1

/*************************************************************************
    > File Name: mychmod.c
    > Author: YinJianxiang
    > Mail: YinJianxiang123@gmail.com 
    > Created Time: 2017年07月17日 星期一 12时40分31秒
 ************************************************************************/

#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 *file_name;

    /*判断参数是否符合要求*/
    if(argc < 3) {
        printf("%s <file name> <mode>\n",argv[0]);
        exit(0);
    }

    /*atoi将字符串转化成int*/
    mode = atoi(argv[1]);

    /*判断mode是否符合要求*/
    if(mode < 0 || mode > 777) {
        printf("mode is wrong\n");
        exit(0);
    }

    /*chmod()识别八进制,转换进制*/
    mode_u = mode/100;
    mode_g = (mode/10)%10;
    mode_o = mode%10;
    mode = (mode_u * 8 * 8) + (mode_g * 8) + mode_o;

    file_name = argv[2];

    if(chmod(file_name,mode) == -1) {
        perror("chmod fail\n");
        exit(0);
    }

    return 0;
}

简化版create

open函数
打开或创建一个文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(const char *pathname,int flags);

pathname打开或创建的文件的文件名
flags表示文件打开方式

成功返回文件描述符,失败返回-1

当flags为O_CREAT时,函数原型为int open(const char *pathname,int flags,mode_t mode);
mode和上面的mode一样,都为八进制数。mode &~ umask得到实际权限。

O_RDONLY 文件只读
O_WRONLY 文件只写
O_RDWR 文件既可读也可写
三个参数只能选择一个。
O_CREAT 当文件不存在时创建一个文件,后面的mode表示此文件的读取权限
O_EXCL 当O_CREAT时,检测文件是否存在,文件存在打开失败,不存在创建一个
O_TRUNC 文件存在并且可写,写时自动覆盖之前的内容,恢复到空
O-APPEND 追加方式写入

creat函数
创建一个文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int creat(const char *pathname,mode_t mode);

pathname所要创建的文件的文件名
mode创建文件的读写性

成功返回文件描述符,失败返回-1

实际create只能创建只写的文件,和后面的参数没有关系

#include<unistd.h>
int close(int fd);

关闭一个文件

fd文件描述符

成功返回0,失败返回-1

/*************************************************************************
    > File Name: myCreate.c
    > Author: YinJianxiang
    > Mail: YinJianxiang123@gmail.com 
    > Created Time: 2017年07月17日 星期一 14时33分26秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>

int main(int argc,char *argv[]) {
    int fd;

    int mode;
    int mode_u;
    int mode_g;
    int mode_o;

    char *file_name;

    if(argc != 3) {
        printf("%s <file name> <mode>\n",argv[0]);
    }

    mode = atoi(argv[2]);

    mode_u = mode/100;
    mode_g = (mode/10)%10;
    mode_o = mode % 10;

    mode = mode_u * 8 * 8 + mode_g * 8 + mode_o;

    file_name = argv[1];

    if(fd = open(file_name,O_CREAT|O_EXCL,mode) == -1) { //creat(file_name,S_IRWXU);
        printf("open:%s with errno:%d\n",strerror(errno),errno);
        //strerror()在string.h库中,errno是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。
        //strerror(errno)表示错误的具体信息。
        exit(1);
    } else {
        printf("the file create successfully\n");
    }

    close(fd);

    return 0;
}

chown命令

chown函数
改变文件的用户id和组id

#include<sys/types.h>
#include<unistd.h>
int chwon(const char *filename,uid_t owner,gid_t group);

成功返回0,失败返回-1

filename所要修改的文件
owner所要修改成的用户id
group所要修改成的组id

/*************************************************************************
  > File Name: my_chown.c
  > Author: YinJianxiang
  > Mail: YinJianxiang123@gmail.com 
  > Created Time: 20170718日 星期二 153806************************************************************************/

#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    uid_t uid;
    gid_t gid;
    struct passwd *pwd;
    char *owner;
    char *group;

    if (argc == 3 ) {
        uid = strtol(argv[1], &owner, 10); 

        if (*owner != 0) {       
            pwd = getpwnam(argv[1]);  
            if (pwd == NULL) {
                perror("getpwnam");
                exit(0);
            }   

            uid = pwd->pw_uid;
        }

        if (chown(argv[2], uid, -1) == -1) {
            perror("chown");
            exit(0);
        }
    } else if (argc == 4) {
        uid = strtol(argv[1],&owner,10);
        gid = strtol(argv[2],&group,10);

        if(*owner != 0) {
            pwd = getpwnam(argv[1]);
            if(pwd == NULL) {
                perror("getnam");
                exit(0);
            }
        }

        if(chown(argv[3],uid,gid) == -1) {
            perror("chown");
            exit(0);
        }
    } else {
        printf("%s <owner> <group> filename or %s <owner> filename\n",argv[0],argv[0]);
        exit(0);
    }

    return 0;
}

owner和group信息存储在passwd结构体中

struct passwd {
    char   *pw_name;       // username
    char   *pw_passwd;     // user password
    uid_t   pw_uid;        // user ID
    gid_t   pw_gid;        // group ID
    char   *pw_gecos;      // user information
    char   *pw_dir;        // home directory
    char   *pw_shell;      // shell program
}
struct passwd *getpwnam(const char *name);通过用户名获取登录用户信息的结构体
#include<stdlib.h>
perror(const char *s)
//s所指的字符串,后面再加上错误原因字符串。

/*************************************************************************
  > File Name: my_chown.c
  > Author: YinJianxiang
  > Mail: YinJianxiang123@gmail.com 
  > Created Time: 20170718日 星期二 153806************************************************************************/

#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    uid_t uid;
    gid_t gid;
    struct passwd *pwd;
    char *owner;
    char *group;

    if (argc == 3 ) {
        uid = strtol(argv[1], &owner, 10); //将字符串转换成long(长整型数)

        if (*owner != 0) {       //不是数字字符的处理方法
            pwd = getpwnam(argv[1]);  
            if (pwd == NULL) {
                perror("getpwnam");
                exit(0);
            }   

            uid = pwd->pw_uid;
        }

        if (chown(argv[2], uid, -1) == -1) {
            perror("chown");
            exit(0);
        }
    } else if (argc == 4) {
        uid = strtol(argv[1],&owner,10);
        gid = strtol(argv[2],&group,10);

        if(*owner != 0) {
            pwd = getpwnam(argv[1]);
            if(pwd == NULL) {
                perror("getnam");
                exit(0);
            }
        }

        if(chown(argv[3],uid,gid) == -1) {
            perror("chown");
            exit(0);
        }
    } else {
        printf("%s <owner> <group> filename or %s <owner> filename\n",argv[0],argv[0]);
        exit(0);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值