Bootstrap

Webserver(1.8)操作函数

文件属性操作函数

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;
}

内容已经被追加到文件中
在这里插入图片描述

在这里插入图片描述

;