美文网首页
linux 内核编程 - 文件IO与文件描述符

linux 内核编程 - 文件IO与文件描述符

作者: Peakmain | 来源:发表于2019-10-09 10:51 被阅读0次

    系统调用

    虚拟内存布局图.png

    3-4G是系统的空间,这部分是由操作系统来管理,如果我们要操作这部分数据,只能借助系统提供的一些函数(系统函数),调用这些函数就称为系统调用


    系统调用.png

    普通函数和内核函数

    • 查看帮组文档
    man 2 open
    

    man表示帮组文档 2表示系统 open表示要查看open文档

    • open
      int open(const char *path, int oflag, mode_t mode);
    

    path:路径名字
    oflag:O_APPEND追加,O_CREAT:没有的时候会创建,O_TRUNC:会截断
    mode:就是创建时的文件权限,只是当前用户可读可写,S_IRUSRIS_IWUSR,返回的是一个文件句柄fd,我们直接通过fd来操作

    • close:关闭文件
    int close(int fd)
    
    • write
    ssize_t write(int fildes, void *buf, size_t nbyte);
    

    fildes:句柄
    buf:写入的缓冲区
    nbyte:每次写多少字节
    ssize_t:返回的是写入的真实个数

    • read
    ssize_t read(int fildes, void *buf, size_t nbyte);
    

    fildes:句柄
    buf:读入的缓冲区
    nbyte:每次读多少字节
    ssize_t:返回的是读到的真实个数

    • 获取错误的信息
      会有一个宏定义errno,通过strerror(error)获取错误信息,需要打印错误信息perror
    man 3 terror
    void perror(const char *s);
    

    s:错误信息的描述

    • 拷贝文件
      1.系统函数:open,close,read,write
      2.普通函数:fopen,fclose,fread/fputc,fwrite/fgetc


      系统函数和普通函数

    文件描述符表

    文件描述符.png

    lseek和fseek

    用来获取偏移量SEEK_START,SEEK_END,SEEK_CUR
    lseek它的便移量,读和写是同一个

    off_t lseek(int fildes, off_t offset, int whence);
    

    stat和lstat

     int stat(const char *path_name, struct stat *restrict buf);
     int lstat(const char *restrict path, struct stat *restrict buf);
    

    目录操作

    判断文件目录是否存在和打开目录下的文件

    #include<stdio.h>
    #include<errno.h>
    #include<dirent.h>
    #include<stat.h>
    
    bool isdir(const char* fileName){
        //int stat(const char *pathname, struct stat *buf);
        strcut stat buf;
        stat(fileName, &buf);
        mode_t st_mode = buf.st_mode;
        return S_ISDIR(st_mode);
    }
    
    int main(int argc, char *argv[]){
        // 打开目录
        DIR *dir = opendir(argv[1]);
        if (dir == NULL){
            perror("open dir fial");
            return -1;
        }
    
        // struct dirent *readdir(DIR *dirp);
        struct dirent* dirp;
        while ((dirp = readdir(dir)) != NULL){
            // printf("%s\t",dirp->d_name);
            // 一个递归
        }
        printf("\n");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:linux 内核编程 - 文件IO与文件描述符

          本文链接:https://www.haomeiwen.com/subject/zsmbpctx.html