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

2019-10-09  本文已影响0人  Peakmain

系统调用

虚拟内存布局图.png

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


系统调用.png

普通函数和内核函数

man 2 open

man表示帮组文档 2表示系统 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来操作

int close(int fd)
ssize_t write(int fildes, void *buf, size_t nbyte);

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

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

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

man 3 terror
void perror(const char *s);

s:错误信息的描述

文件描述符表

文件描述符.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;
}
上一篇下一篇

猜你喜欢

热点阅读