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: 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;}
- Linux下一些文件操作和一些简单命令的自己实现
- linux下的一些简单命令操作
- 一些简单常用的linux操作命令
- linux一些简单的操作命令
- linux下的一些实用命令和操作
- linux下一些简单的命令~
- Linux下一些简单命令的收集
- Linux下一些操作Tomcat的命令
- linux 下 mysql的一些操作命令
- linux 文件操作的一些命令
- linux文件操作的一些命令
- linux下一些简单的用户操作
- linux下一些操作命令
- Linux下一些操作命令
- linux下的一些文件操作函数
- Linux下的一些文件操作
- 虚拟机和linux一些简单的命令
- linux下oracle 11g一些简单的操作和一些错误处理
- SGU
- 2017暑假集训 div1 DP(1)
- C语言基础之变量
- JAVADOC注释详解
- zabbix的Java API(一)
- Linux下一些文件操作和一些简单命令的自己实现
- Linux文件批量改名/排序总结(rename,sort等)
- Echrtart 数据对接
- 端口号心得
- nginx如何配置虚拟主机
- Ubuntu下Geth客户端搭建私有网络集群
- Verilog中wire与reg类型的区别(转载自http://www.cnblogs.com/farbeyond/p/5204586.html)
- Matlab导入整个文件夹目录下txt文档到数据库
- 将oracle远程数据库导出导入到本地