简化版 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: 2017年07月18日 星期二 15时38分06秒
************************************************************************/
#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: 2017年07月18日 星期二 15时38分06秒
************************************************************************/
#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;
}