linux 内核编程 - 文件IO与文件描述符
2019-10-09 本文已影响0人
Peakmain
系统调用
虚拟内存布局图.png3-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
系统函数和普通函数
文件描述符表
文件描述符.pnglseek和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;
}