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

来源:互联网 发布:飞狐交易师数据下载 编辑:程序博客网 时间:2024/05/18 23:52

简化版 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;}
原创粉丝点击