C++程序员必会知识
- int access(const char *pathname,int mode); //access使用权
作用:判断某个文件是否有某个权限,或者判断文件是否存在
参数:
pathname:文件路径
mode: R_OK 判断是否有读权限
W_OK 判断是否有写权限
X_OK 判断是否有执行权限
返回: 成功返回 0 失败 -1
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char *argv[]){ if(argc < 2){ printf("%s filename\n",argv[0]); exit(0); } int res = access(argv[1],F_OK); if(res == -1){ perror("access"); return 0; } printf("ok\n"); return 0; }
- int chmod(const char*filename,int mode);
作用:修改文件的权限
参数:
pathname:文件路径
mode: 八进制数
返回: 成功返回 0 失败 -1
- int chown(const char *path,wid_t ower,git_t group);
作用:修改文件的所有者和所有组 /etc/passwd /etc/group
参数:
path:文件路径
ower:修改后的所有者
group:修改后的所有组
返回: 成功返回 0 失败 -1
- int truncate(const char*path,off_t length);
作用:缩减或者扩展文件的尺寸至指定大小
参数:
path:文件路径
length:问价大小
返回: 成功返回 0 失败 -1
- int stat(const char*pathname,struct stat *statbuf);
作用:获取文件相关的一些信息
参数:statbuf 传出参数,保存文件相关的信息 ,stat是一个结构体
返回: 成功返回 0 失败 -1
我们在终端输入ll时最前的那个串(特殊权限位我们一般不需要考虑)
文件类型的判断:st_mode & S_IFMT就可以得到相应的文件类型的宏
其实我们在使用 open函数时也一样,为什么哟啊用 | 来设置权限呢?
就是因为每一个位都代表了不同的含义,通过或操作就可以把相应的位设置为1,如此以来就可以得到相应的权限了。
所有者权限
所有组权限
其它人
stat小案例:模拟ls filename
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <pwd.h> #include <grp.h> #include <time.h> #include <stdlib.h> #include <time.h> #include <string.h> int main(int argc,char *argv[]){ //判断输入的参数是否正确 if(argc < 2){ printf("%s filename\n",argv[0]); return 0; } //通过stat函数获取用户传入的文件信息 struct stat st; //保存用户的信息 int res = stat(argv[1],&st); if(res == -1){ perror("stat"); exit(-1); } //保存文件类型和权限 char perms[11] = {0}; //通过st获取文件类型 switch(st.st_mode & S_IFMT){ case S_IFLNK://如果是链接 perms[0] = 'l'; break; case S_IFREG://如果是普通文件 perms[0] = '-'; break; case S_IFDIR://如果是文件夹 perms[0] = 'd'; break; case S_IFBLK://如果是块文件 perms[0] = 'd'; break; case S_IFIFO://如果是管道 perms[0] = 'p'; break; case S_IFCHR://如果是字符设备 perms[0] = 'c'; break; case S_IFSOCK://如果是套接字 perms[0] = 's'; break; default: break; } //获取文件权限 //1.文件所有者 perms[1] = (st.st_mode & S_IRUSR) ? 'r':'-'; perms[2] = (st.st_mode & S_IWUSR) ? 'w':'-'; perms[3] = (st.st_mode & S_IXUSR) ? 'x':'-'; //2.文件所有组 perms[4] = (st.st_mode & S_IRGRP) ? 'r':'-'; perms[5] = (st.st_mode & S_IWGRP) ? 'w':'-'; perms[6] = (st.st_mode & S_IXGRP) ? 'x':'-'; //3.其他人 perms[7] = (st.st_mode & S_IROTH) ? 'r':'-'; perms[8] = (st.st_mode & S_IWOTH) ? 'w':'-'; perms[9] = (st.st_mode & S_IXOTH) ? 'x':'-'; //获取硬连接数 int linkNum = st.st_nlink; //文件所有者 char *fileUser = getpwuid(st.st_uid)->pw_name; //文件所有组 char *fileGup = getgrgid(st.st_gid)->gr_name; //文件大小 long int fileSize = st.st_size; //获取修改时间 char *time = ctime(&st.st_mtime); char mtime[512] = {0}; strncpy(mtime,time,strlen(time)-1); //输出buf char buf[1024] = {0}; sprintf(buf,"%s %d %s %s %ld %s\n",perms,linkNum,fileUser,fileGup,fileSize,mtime); printf("%s\n",buf); return 0; }
- int open(const char* pathname,int flags); //打开文件
- int open(const char* pathname,int flags,mode_t mode); //创建文件
参数:pathname 要创建的文件路径
flags:对文件的操作权限和其它设置
必选项:O_RDONLY O_WRONLY O_RDWR
可选项:O_CREATE
每一个标志位都对应着一种权限(例如可写、可读)
mode:八进制数,表示创建出来的操作权限,eg:0777
正真的权限mode & umask[umask是系统提供的掩码,默认为 0775==>限制某些权限,防止误操作]
补充:error,在系统函数中很多函数发生错误时,会设置error
error:/usr/include/errno.h ==> 定义在文件中
- 定义在头文件 errno.h中,是个全局变量
- 任何标准c库函数都可以对其进行改变(Linux系统函数更可以)
- 错误宏定义的位置:1~34 -->/user/include/asm-generic/errno-base.h 35~133-->/user/include/asm-generic/errno.h
- 是记录系统的最后一次错误代码(其实就是一个int值):每一个errno值都对应着以字符串对应的字符串、当调用"某些"函数出错时,该函数会重新设置error的值
- 配用的c库函数perror void perror(const char*s) 函数说明:默认情况下将错误信息打印到终端,参数s所指的字符串会先打印出,后面再加 上错误原因字符串。
- ssize_t read(int fd,void *buf,size_t count);
作用:从fd指向的文件中读取(复制)count字节的数据到buf中
- ssize_t write(int fd,const void*buf,size_t count);
作用:将buf中的内容写入fd指向的文件中,写入count个字节
- off_t lseek(int fd,off_t offset,int whence);
作用:移动文件指针到文件头部 lseek(fd,0,SEEK_SET);
获取当前的文件指针所在的位置 lseek(fd,0,SEEK_CUR);
获取文件的长度 lseek(fd,0,SEEK_END);
扩展文件的长度 lseek(fd,100,SEEK_END);//扩展100字节
write(fd," ",1);//必须写操作,才可实现扩展
参数:
offset:偏移量-->相对于文件指针当前的位置
whence-->SEEK_SET文件头 SEEK_CUR当前位置 SEEK_END文件尾
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(){ //打开一个文件 int fd = open("a.txt",O_RDWR | O_CREAT); if(fd == -1){ perror("open"); exit(-1); } //向文件中写东西 char buf[1024] = {0}; sprintf(buf,"%s","aaaaaaaaaaaaaa"); ssize_t size = write(fd,buf,sizeof(buf)); //获取文件中的数据 lseek(fd,0,SEEK_SET); //写入操作会是文件指针移动到文件末尾 memset(buf,0,sizeof(0)); size = read(fd,buf,sizeof(buf)); printf("%s\n",buf); //获取文件大小 off_t s = lseek(fd,0,SEEK_END); printf("当前文件大小为:%ld\n",s); //扩展文件truncate lseek都可以,建议使用truncate int res = truncate("a.txt",1024); if(res == -1){ perror("truncate"); exit(-1); } //获取文件大小 s = lseek(fd,0,SEEK_END); printf("当前文件大小为:%ld\n",s); //扩展文件truncate lseek都可以,建议使用truncate lseek(fd,100,SEEK_END); write(fd," ",1); //获取文件大小 s = lseek(fd,0,SEEK_END); printf("当前文件大小为:%ld\n",s); return 0; }