Linux学习笔记:目录IO与帧缓冲

这篇接着之前的文件IO往下记,主要是目录操作、一些常用辅助函数,还有framebuffer的基本用法。

一、目录IO

目录也是文件,操作思路跟普通文件一样:打开、读、关闭。

  1. 打开和关闭目录

DIR *opendir(const char *name);

打开一个目录,成功返回目录流指针,失败返回NULL。

int closedir(DIR *dirp);

关闭目录,成功返回0,失败-1。

  1. 读取目录内容

struct dirent *readdir(DIR *dirp);

从目录流里读一条文件信息,成功返回struct dirent指针,读到末尾或失败返回NULL。

这个结构体里重点关注两个字段:

struct dirent {

ino_t d_ino; // inode号

char d_name256; // 文件名

};

  1. 创建目录

int mkdir(const char *pathname, mode_t mode);

创建一个目录文件,参数是目录名和权限,成功0失败-1。

  1. 遍历目录的例子

下面这段代码遍历/dev目录,打印每个文件的名字和inode号,跳过以点开头的隐藏文件:

int main(void)

{

DIR *pdir = opendir("/dev");

if (NULL == pdir)

{

printf("opendir error\n");

return -1;

}

while (1)

{

struct dirent *pinfo = readdir(pdir);

if (NULL == pinfo)

{

break;

}

if ('.' == pinfo->d_name0)

{

continue;

}

printf(" %s : %ld\n", pinfo->d_name, pinfo->d_ino);

}

closedir(pdir);

return 0;

}

二、其他常用函数

  1. 格式化输出系列

除了最常用的printf,还有几个变体:

int fprintf(FILE *stream, const char *format, ...);

把格式化字符串写入指定的文件流。

int dprintf(int fd, const char *format, ...);

跟fprintf类似,只不过参数是文件描述符而不是文件流指针。

int sprintf(char *str, const char *format, ...);

把格式化结果写到字符数组里,常用于字符串拼接或者把数字转成字符串。

  1. 字符串截取

char *strtok(char *str, const char *delim);

按指定分隔符截取字符串。第一次调用传原始字符串,后续调用传NULL,会接着上一次的位置继续截。截到末尾返回NULL。

  1. 出错处理

Linux系统调用失败时会设置全局变量errno,两个常用的错误处理函数:

char *strerror(int errnum);

把错误码转换成对应的错误信息字符串。

void perror(const char *s);

直接打印自定义提示加上系统给出的错误原因,比如 perror("open") 会输出 open: No such file or directory 这种格式。

三、Framebuffer

  1. 什么是framebuffer

帧缓冲,是Linux给显示设备提供的一个接口。它把显存抽象成设备文件,应用层往这个设备里写数据,就能控制屏幕上每个像素点的颜色。

  1. 操作步骤

  2. 打开显示设备文件 /dev/fb0

  3. 获取显示参数(分辨率、位深度)

  4. 建立内存映射

  5. 往映射空间写RGB颜色值

  6. 解除映射

  7. 关闭设备文件

核心是mmap函数:

void *mmap(void *addr, size_t length, int prot, int flags,

int fd, off_t offset);

建立文件和用户空间的内存映射。几个关键参数:

  • addr :要映射的用户空间首地址,传NULL让内核自动分配

  • length :映射空间大小

  • prot :读写权限,一般用 PROT_READ | PROT_WRITE

  • flags :通常用 MAP_SHARED ,共享映射

  • fd :要映射的文件描述符

  • offset :映射偏移量

成功返回映射到的用户空间首地址,失败返回 MAP_FAILED 。

拿到映射地址之后,直接往里面写RGB值就能在屏幕上画点了,本质上就是操作一块连续的内存。

以上就是目录IO、常用辅助函数和framebuffer的核心内容,都是Linux应用编程里比较基础的部分,记下来方便以后翻。

相关推荐
hongmai6668881 小时前
把玩ESP8684-WROOM-04C-H4X:一颗耐高温的RISC-V小钢炮
笔记·单片机·嵌入式硬件·物联网·risc-v
玫瑰互动GEO1 小时前
抖音SEO优化技术拆解:搜索排名四大因子与4步落地算法分析
人工智能·算法·搜索引擎·语音识别
三8441 小时前
WordPress SQL 注入漏洞分析:从 author__not_in 参数到 REST API 全链路
linux·前端·数据库
SCandL1521 小时前
k8s工作原理
linux·运维·服务器
其实防守也摸鱼1 小时前
如何使用自动化教育SRC漏洞挖掘系统--AutoHunter
运维·网络·人工智能·学习·安全·web安全·自动化
weixin_444579301 小时前
Rockylinux 与 K8s 的安装
linux·云原生·容器·kubernetes
听风3471 小时前
Arch Linux 包管理 TUI 工具集
linux·服务器·archlinux
Interview Aid1121 小时前
Akuna OA 题目拆解|三题思路复盘
linux·运维·算法·面试·职场和发展
天天爱吃肉82181 小时前
XCP协议 Part 1 概述 — 完整学习笔记(商用车主机厂工程师版)
大数据·笔记·python·学习·汽车