Webserver(1.8)操作函数
目录
- 文件属性操作函数
- access函数
- chmod函数
- chown函数
- truncate函数
- 目录操作函数
- mkdir函数
- rmdir函数
- rename函数
- chdir函数
- *getcwd函数
- 目录遍历函数
- *opendir函数
- *readdir函数
- closedir函数
- dup、dup2函数
- dup
- dup2
- fcntl函数
文件属性操作函数
access函数
判断某个文件是否有某个权限,或者判断文件是否存在
#include <unistd.h>
#include <stdio.h>
int main(){
int ret = access("a.txt",F_OK);
if(ret==-1){
perror("access");
}
printf("文件存在!!\n");
return 0;
}
chmod函数
修改文件的权限
#include<sys/stat.h>
#include<stdio.h>
int main(){
int ret=chmod("a.txt",0777);
if(ret==-1){
perror("chmod");
return -1;
}
return 0;
}
修改权限之后,文件权限改变了
chown函数
改变文件所在组
truncate函数
缩减或者扩展文件的尺寸至指定的大小
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main(){
int ret=truncate("a.txt",5);
if(ret==-1){
perror("truncate");
return -1;
}
return 0;
}
a.txt大小扩展到20个字节
缩减到5个字节的话,会把后面超出部分直接删除
目录操作函数
mkdir函数
生成一个目录
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
int main(){
int ret =mkdir("aaa",0777);
if(ret==-1){
perror("mkdir");
return -1;
}
return 0;
}
最终的权限会与umask进行一个&,抹除部分权限
rmdir函数
删除一个目录,只能删除框目录,如果有内容的话,要先把内容删掉,然后再调用这个函数
rename函数
修改目录的名字
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
int main(){
int ret =rename("aaa","bbb");
if(ret==-1){
perror("rename");
return -1;
}
return 0;
}
aaa变成了bbb
chdir函数
修改进程的当前工作目录
*getcwd函数
获取当前的工作路径
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main(){
//获取当前的工作目录
char buf[128];
getcwd(buf,sizeof(buf));
printf("当前的工作目录是:%s\n",buf);
//修改工作目录
int ret=chdir("/home/nowcoder/Linux/lesson13");
if(ret==-1){
perror("chdir");
return -1;
}
//创建一个新的文件
int fd=open("chdir.txt",O_CREAT | O_RDWR,0664);
if(fd==-1){
perror("open");
return -1;
}
//获取当前的工作目录
char buf1[128];
getcwd(buf1,sizeof(buf1));
printf("当前的工作目录是:%s\n",buf1);
return 0;
}
改变工作路径之后,创建文件在新的工作路径下
目录遍历函数
*opendir函数
*readdir函数
读取目录中的数据
closedir函数
关闭目录
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
int getFileNum(const char * path);
//读取某个目录下所有普通文件的个数
int main(int argc, char * argv[]){
if(argc<2){
printf("%s path\n",argv[0]);
return -1;
}
int num=getFileNum(argv[1]);
printf("普通文件的个数为:%d\n",num);
return 0;
}
//用于获取目录下所有普通文件的个数
int getFileNum(const char * path){
//1.打开目录
DIR * dir=opendir(path);
if(dir==NULL){
perror("opendir");
exit(0);
}
struct dirent * ptr;
//记录普通文件的个数
int total=0;
while((ptr=readdir(dir))!=NULL){
//获取名称
char * dname=ptr->d_name;
//忽略掉.和..
if(strcmp(dname,".")==0||strcmp(dname,"..")==0){
continue;
}
//判断是否是普通文件
if(ptr->d_type==DT_DIR){
//目录,需要继续读取这个目录
char newpath[256];
sprintf(newpath,"%s/%s",path,dname);
total+=getFileNum(newpath);
}
if(ptr->d_type==DT_REG){
total++;
}
}
//关闭目录
closedir(dir);
return total;
}
dup、dup2函数
dup
复制文件描述符,新的文件描述符和旧的指向同一个文件,多个文件描述符可以指向同一个文件
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>
int main(){
int fd = open("a.txt",O_RDWR | O_CREAT,0664);
int fd1=dup(fd);
if(fd1==-1){
perror("dup");
return -1;
}
printf("fd :%d,fd1:%d\n",fd,fd1);
close(fd);
char * str="hello,world";
int ret=write(fd1,str,strlen(str));
if(ret==-1){
perror("write");
return -1;
}
close(fd1);
return 0;
}
会从空闲中找一个最小的文件描述符用
dup2
重定向文件描述符
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>
int main(){
int fd=open("1.txt",O_RDWR | O_CREAT,0664);
if(fd==-1){
perror("open");
return -1;
}
int fd1=open("2.txt",O_RDWR | O_CREAT,0664);
if(fd1==-1){
perror("open");
return -1;
}
printf("fd:%d,fd1:%d\n",fd,fd1);
int fd2=dup2(fd,fd1);
if(fd2==-1){
perror("dup2");
return -1;
}
//通过fd1去写数据,实际操作的是1.txt,而不是2.txt
char * str ="Hello,dup2";
int len=write(fd1,str,strlen(str));
if(len==-1){
perror("write");
return -1;
}
printf("fd:%d,fd1:%d,fd2:%d\n",fd,fd1,fd2);
close(fd);
close(fd1);
return 0;
}
fcntl函数
复制文件描述符
设置/获取文件的状态标志
#define _DEFAULT_SOURCE
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include <stdlib.h>
#include<unistd.h>
int main(){
//复制文件描述符
//int fd=open("1.txt",O_RDONLY);
//int ret=fcntl(fd,F_DUPFD);
//修改或者获取文件状态的flag
int fd=open("1.txt",O_RDWR);
if(fd==-1){
perror("open");
return -1;
}
//获取文件描述符状态FLAG
int flag=fcntl(fd,F_GETFL);
flag |=O_APPEND;
//修改文件描述符状态的flag,给flag加入O_APPEND
int ret=fcntl(fd,F_SETFL,flag);
if(ret==-1){
perror("fcntl");
return -1;
}
char * str="nihao";
write(fd,str,strlen(str));
close(fd);
return 0;
}
内容已经被追加到文件中