Linux应用软件编程:目录IO与framebuffer

一、目录IO

opendir

DIR *opendir(const char *name);

功能:打开目录文件并获得目录流指针

参数:

name:目录名

返回值:

成功:目录流指针

失败:NULL

closedir

int closedir(DIR *dirp);

功能:关闭目录文件

参数:

dirp:目录流指针

返回值:

成功: 0

失败:-1

readdir

struct dirent *readdir(DIR *dirp);

功能:从目录流中读取数据

参数:

dirp:目录流指针

返回值:

成功:struct dirent 指针,代表读到的文件信息

失败:NULL

文件末尾:NULL

struct dirent {

ino_t d_ino; /* Inode number */

off_t d_off; /* Not an offset; see below */

unsigned short d_reclen; /* Length of this record */

unsigned char d_type; /* Type of file; not supported

by all filesystem types */

char d_name256; /* Null-terminated filename */

};

命令

mkdir:创建文件夹

touch:创建普通文件

open();

fopen();

mkdir();

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

功能:创建一个目录文件(文件夹)

参数:

pathname:目录名称

mode:目录文件的操作权限

返回值:

成功:0

失败:-1

目录遍历:

cpp 复制代码
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_name[0])
		{
			continue;
		}
		printf(" %s : %ld\n", pinfo->d_name, pinfo->d_ino);
	}

	closedir(pdir);
	return 0;
}

二、framebuffer

  1. 什么是framebuffer

    帧缓存、帧缓冲技术。

    是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,通过该设备文件可以实现应用层向显存空间的数据写入,从而实现像素点的绘制。

  2. 如何操作framebuffer

    通过内存映射技术,可以实现显存空间和用户空间的内存映射,通过向用户空间写入RGB颜色值,从而实现显存数据的写入。

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

    2. 获取显示设备相关参数:分辨率、像素点的位数(位深度)

    3. 建立内存映射

    4. 写入RGB颜色值

    5. 解除内存映射

    6. 关闭显示设备文件

cpp 复制代码
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((void *)-1)
相关推荐
小马同学-8 小时前
OpenStack 使用实战:Web 界面与 CLI 命令行实验
运维·云计算·openstack
GeW8 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
wzdark8 小时前
多维数组在算法设计中的存储映射问题4
算法
Escalating_xu8 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊8 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩8 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
网安老伯9 小时前
都2026年了,还在问网络安全怎么入门?看完这一篇你就懂了
运维·计算机网络·web安全·网络安全·wireshark·密码学·网络攻击模型
Phil3239 小时前
多智能体不是越多越好:Google《Towards a Science of Scaling Agent Systems》论文深度解读
算法
6Hzlia9 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
小祺先生9 小时前
mt7921 debian系统 如何安装驱动
运维·网络·debian