一、linux_C函数接口手册
在线手册
Linux 常用C函数(中文版)
linux一切皆文件
在linux系统下一切都是以文件的形式存储在系统中的,通过linux系统提供的IO(input/output)接口开发板就可以往linux系统中
输入一些信息和获取一些信息。
linux系统的文件分类:
- 普通文件:存在于外部存储器中,用于存储普通数据。
d 目录文件:用于存放目录项,是文件系统管理的重要文件类型。
p 管道文件:一种用于进程间通信的特殊文件,也称为命名管道FIFO。
s 套接字文件:一种用于网络间通信的特殊文件。
l 链接文件:用于间接访问另外一个目标文件,相当于Windows快捷方式。
c 字符设备文件:字符设备在应用层的访问接口。
b 块设备文件:块设备在应用层的访问接口。
基于linux操作系统的开发框架
二、linux系统IO接口使用
man 2 open 查看open函数接口
1、open 打开文件
NAMEopen, openat, creat - open and possibly create a file功能: 打开 和 或许 创建 一个 文件
SYNOPSIS#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);pathname: 打开的文件路径名 flags: O_RDONLY 只读O_WRONLY 只写O_RDWR 读写返回值: 成功 新的文件描述符 失败 -1 例子:打开一个普通文本文件
int fd = open("./my.txt",O_RDWR);
if(fd < 0)
{printf("打开文件失败\n");
}else
{printf("打开文件成功\n");
}
open 附加参数
//以创建的方式打开文件int open(const char *pathname, int flags, mode_t mode);pathname:文件路径名 mode : 设置创建文件的权限 flags: 权限参数三选一O_RDONLY 只读O_WRONLY 只写O_RDWR 读写附加参数O_APPEND 追加模式 👉 int fd = open("my.txt",O_RDWR|O_APPEND); 追加模式每次打开文件光标在末尾O_TRUNC 清空模式 👉 int fd = open("my.txt",O_RDWR|O_TRUNC); 清空模式每次打开文件都清空所有内容O_CREAT 创建模式 👉 int fd = open("my.txt",O_RDWR|O_CREAT,0777); 创建模式文件不存在则会创建文件,并设置rwxrwxrwx权限O_EXCL|O_CREAT 检查模式 👉 int fd = open("my.txt",O_RDWR|O_EXCL|O_CREAT,0777); 检查模式,文件不存在则创建,文件存在则打开失败。
文件描述符队列
linux系统中用户每次打开一个文件,操作系统就会生成一个对应的描述符,后续用户想要操作该文件时,只需要操作这个描述符即可!
2、write 写入文件
man 2 write 查看写入接口
NAMEwrite - write to a file descriptor功能: 写入 一个 文件 描述符
SYNOPSIS#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);fd:需要写入的文件描述符 buf:数据的缓存地址 count:数据的大小 返回值:成功 返回写入的字节数 失败 -1例子:写入数据到文件中
write(fd,"hello",5); char buf[1024] = {"hello"}; // 只赋值前面5个字符,后面都是 0
int size = write(fd, buf, sizeof(buf)); //sizeof(buf) 把hello 后面的0也写入文件中了 ❌
int size = write(fd, buf, strlen(buf)); // strlen(buf) 字符串有效长度 5 ✔️ 注意:写入数据到文件中时,必须写入数据的真实大小。否则会写入乱码!
3、read 读取文件
man 2 read 查看读取接口
NAMEread - read from a file descriptor功能 读取 从 一个 文件 描述符
SYNOPSIS#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);fd:需要读取的文件描述符 buf:读取后数据的存储地址 count:需要读取的数据大小 返回值: 大于 0 成功读取到的字节数 等于 0 文件读取完毕 ✔️一直读取一个文件,直到为0,则文件读取完毕! 小于 0 文件读取错误 例子:读取一个文件的内容到缓存中
char buf[1024]={0};
read(fd,buf,1024); 例子:读取一个文件的中的所有内容
while(1)
{char buf[1024]={0}; if(read(fd,buf,1024) == 0){break; }
} 注意:在读取一个文件时,用户定义的缓存为多大,则读取多大。 1.如果文件的数据比缓存小,则会全部数据读取出来。 2.如果文件的数据比缓存大,则需要多次读取直到返回0
4、lseek 文件光标
当用户操作一个文件描述符时,每次读写文件光标的位置都会发生偏移 ,用户可以使用lseek 修改文件光标的当前位置!
NAMElseek - reposition read/write file offset修改 读/写 文件 位置
SYNOPSIS#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);fd:需要修改的文件描述符 offset:偏移量 whence:参考位置 (参照物)SEEK_SET 文件头 SEEK_CUR 光标当前位置 SEEK_END 文件末尾 例子:把光标移动到文件头
lseek(int fd,0,SEEK_SET); //从文件SEEK_SET(头)开始偏移0个位置。
lseek(int fd,0,SEEK_END); //从文件SEEK_END(末尾)开始偏移0个位置。
5、close 关闭文件描述符
NAMEclose - close a file descriptorSYNOPSIS#include <unistd.h>int close(int fd);fd:需要关闭的文件描述符
系统IO访问设备文件
linux系统的设备文件与普通文件是一样的,都是以文件的形式存储到系统的磁盘中。所以用户只需要1.打开设备文件
2.写入或者读取设备文件 3.关闭设备文件即可访问设备文件。
访问LCD设备流程
1.打开LCD设备文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main()
{// 1.打开LCD设备文件int lcd_fd = open("/dev/fb0", O_RDWR);if (lcd_fd < 0){printf("打开LCD设备失败\n");return -1;}else{printf("打开LCD设备成功\n");}
}
2.往设备文件写入内容
注意:1.如果文件类型是普通ASCII文件,就可以写入字符串!
2.如果文件类型是设备文件,就要写入设备需要数据!
当前操作的是LCD设备,LCD设备的作用是显示图像的,所以就应该往屏幕中写入一些图像数据!
// 0xFFFF00 黄色 -> intint color[800 * 480] = {0};for (int i = 0; i < 800 * 480; i++){color[i] = 0xFFFF00; // 把所有颜色点赋值为黄色}// 2.写入数据到LCD设备文件中write(lcd_fd, color, 800 * 480 * 4);
3、计算机表达图像的方式
图像组成的基本单位像素点
4、像素点的组成
所以想要LCD屏幕显示对应的图像,只有把对应图像的像素点,写入屏幕设备即可!
RGB颜色查询对照表|RGB颜色|三原色配色表
一个像素点由 R,G,B 组成,每个RGB的取值范围是
R:0 -> 255 , 一个字节
G:0 -> 255 , 一个字节
B:0 -> 255 , 一个字节 红色:0xFF0000
绿色:0x00FF00
蓝色:0x0000FF
天蓝:0x00FFFF
黄色:0xFFFF00
屏幕像素点与缓存的关系
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{// 1.打开LCD设备文件int lcd_fd = open("/dev/fb0", O_RDWR);if (lcd_fd < 0){printf("打开LCD设备失败\n");return -1;}else{printf("打开LCD设备成功\n");}// 2.定义一个二维数组int color[480][800] = {0};// 分区域赋值for (int y = 0; y < 240; y++){for (int x = 0; x < 400; x++){color[y][x] = 0xff0000;}}for (int y = 0; y < 240; y++){for (int x = 400; x < 800; x++){color[y][x] = 0x00ff00;}}for (int y = 240; y < 480; y++){for (int x = 0; x < 400; x++){color[y][x] = 0x0000ff;}}for (int y = 240; y < 480; y++){for (int x = 400; x < 800; x++){color[y][x] = 0xff00ff;}}// 把缓存区写入到LCD屏幕中write(lcd_fd, color, sizeof(color));
}
至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!