首页 >> 知识 >> 文件描述符的文件操作(非缓冲)

文件描述符的文件操作(非缓冲)

文件描述符: 内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读、写、创建、删除等操作。

1、打开,创建,关闭文件 open 和 creat 都能打开和创建函数,原型为

#include //头文件#include #include int open(const char *pathname, int flags); //文件名 打开方式int open(const char *pathname, int flags, mode_t mode); //文件名 打开方式 权限int creat(const char *pathname, mode_t mode); //文件名 权限 //现在已经不常用了creat 函数等价于 open(pathname,O_CREAT|O_TRUNC|O_WRONLY,mode);int close(int fd);//fd 表示文件描述符

2、文件的读写

#include ssize_t read(int fd, void *buf, size_t count);//文件描述词 缓冲区 长度ssize_t write(int fd, const void *buf, size_t count);

对于读写文件的阻塞和非阻塞的问题 比如:read(fd,buf,bufsiz)从fd中取bufsiz个字节到buf数组,在此期间可以认为是堵塞的,但是能快就能返回,当fd是交互的io,比如STDIN_FILENO时,这认为是一个低速系统调用,可能会堵塞很长时间,所以一般要对这种可能会堵塞长时间的低速系统调用进行定时控制

#include#include#include#include#includemain(){char buf[512]={"111"};int flags = fcntl(STDIN_FILENO,F_GETFL);//1. 获取标准输入的状态flags printf("%d ",flags);flags |= O_NONBLOCK; //2. 重新设置状态旗标。此处表示非阻塞输入fcntl(STDIN_FILENO,F_SETFL,flags); //3. 将新的状态旗标设置进去read(STDIN_FILENO,buf,512);puts(buf);printf(" -------------------------------------------------- ");flags ^=O_NONBLOCK;fcntl(STDIN_FILENO,F_SETFL,flags); //4. 通过异或清除非阻塞标志位read(STDIN_FILENO,buf,512);puts(buf);}

如果设置非阻塞的话,很快就返回了,但是如果设置的是阻塞状态的话,他就是要等待用户进行输入才行

2.获取文件信息

#include #include #include int stat(const char *file_name, struct stat *buf); //文件名 statint fstat(int fd, struct stat *buf); //文件描述词 stat 结构体指针int lstat(const char *file_name, struct stat *buf);lstat 函数类似于 stat, 但是当命名的文件是一个符号
网站地图