第二天:linux系统开发
环境搭建
安装VScode
VSCode:严格意义上将,VSCode 它并不算通过完整的IDE,但是VSCode 支持插件安装,且VSCode本身提供了丰富的插件,使得开发者可以快速构建一个轻量级集成开发环境。
开发环境搭建
安装VSCode
VScodeUserSteuup
安装编译工具链
安装VSCode插件
硬件设备访问
设备访问机制:应用程序不能直接访问硬件设备,只能借助系统调用接口来间接冯文硬件
因为linux系统一切皆文件,所以硬件设备访问往往也被转换为文件操作。
设备访问时,首先需要系统中硬件设备对应的设备文件再借助系统的IO函数达到访问的目的。
回顾:
文件操作步骤:
- 打开文件
- 文件读写操作
- 关闭文件
相关概念
在linux中如何标识一个文件?
文件描述符(fd):本质是一个非负整数。
什么是文件?
简单的说,文件就是存储在硬件磁盘上的数据集合。文件通过什么来表示?
系统中在处理的文件(读、写操作)的时候,需要唯一能够识别这个文件,就需要一个针对文件的标识,以便在其它地方能识别出这个文件,于是就产生了文件描述符。
文件描述符:
文件描述符是一些整数,简单的说就是一个文件ID,用于在系统中唯一的标识一个文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况。可打开的文件描述符总数可利用cat /proc/sys/fs/file-max 来查看。#define STDIN_FILENO 0 // 标准输入设备文件描述符
#define STDOUT_FILENO 1 // 标准输出设备文件描述符
#define STDERR_FILENO 2 // 标准错误设备文件描述符
常用的系统IO函数
access
函数头文件:
#include <fcnt1.h>
#include <unistd.h> freecontrol
函数原型:
int access(const char *pathname,int mode)
函数功能: 确认文件的操作权限、文件是否存在
函数参数: pathname:待操作文件/目录的路径
mode:待确认的模式,取值如下:
F_OK:判断文件是否存在
R_OK:判断文件是否有读权限
W_OK:判断文件是否有写权限
X_OK:判断文件是否有执行权限
函数返回值:0 :成功返回0
-1:失败返回-1
错误码放在errno
open
函数头文件:
#include <fcnt1.h> #include <unistd.h> freecontrol
函数原型:
int open(const char *pathname,int mode)
int open(const char *pathname,int flag,int mode)
函数功能: 打开或创建文件,获取文件描述符
函数参数:
pathname
:待操作文件的路径
flags
:打开方式,取值如下: 必选项:
O_RDONLY
:只读
O_WRONLY
:只写
O_RDWR
:读写 附加项(常用):
O_APPEND
O_CREAT
O_TRUNC
mode:如果创建文件
以新建方式打开文件,这个参数用于设置文件的访问权限,
函数返回值:0 :成功返回0
-1:失败返回-1
错误码放在errno
X_OK:判断文件是否有执行权限
read
函数头文件:
#include <fcnt1.h> #include <unistd.h> freecontrol
函数原型:
ssize_t read(int fd, void *buf, size_t count);
函数功能:从文件中读取文件内容
函数参数:
fd:要操作的文件描述符;
buf:数据缓冲区,用来临时存放读取到的数据:
count:设置要读取的字节数
返回值:
成功:返回实际读取到的字节数
0 :到达文件尾部,或没有可读的数据
出错:返回 -1,并将错误码存入 errno 中
write
函数头文件:
#include <fcnt1.h> #include <unistd.h> freecontrol
函数原型:
ssize_t write(int fd,const void *buf, size_t size);
函数功能:向文件中写入数据
函数参数:
fd:要操作的文件描述符;
buf:来存储要写入的文件数据
count:文件数据的长度
返回值:
成功:返回实际读取到的字节数
0 :到达文件尾部,或没有可读的数据
出错:返回 -1,并将错误码存入 errno 中
close
函数头文件:
#include <fcnt1.h> #include <unistd.h> freecontrol
函数原型:
int close(int fd);
函数功能:关闭文件,释放文件描述符
返回值:
成功,返回0,
失败返回-1,并将错误码放入 errno
lseek
函数头文件:
#include <fcnt1.h> #include <unistd.h> freecontrol
函数原型:
off_t lseek(int fd, off_t offset, int whence)
函数功能:移动文件指针
函数参数:
fd:要操作的文件描述符;
offset:相对于whence 的偏移量;
whence :移动方式,可取以下值
SEEK_SET: 文件头部
SEEK_CUR: 当前位置
SEEK_END: 文件末尾
函数返回值:
mmap/munmap
函数头文件:
include <sys/mman.h>
函数原型:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
函数功能:映射/解除映射 文件存储空间到进程的虚拟地址空间
函数参数:
addr :待映射的内存首地址,NULL 表示让系统决定;
length:映射的内存长度
prot:映射属性,代表了对映射后的内存操作方式(要和文件/设备的打开方式对应)
PROT_NONE
PROT_READ
PROT_WRITE
PROT_EXEC
flags: 映射的地址空间的访问标记
MAP_SHARED
MAP_PRIVATE
fd: 待映射的文件/设备的描述符
offset: 待映射的文件/设备的内容的偏移量(需要是内存页面(4096)的整数倍)
注:prot,flags参数相见手册
函数返回值:成功mmap
返回映射后的首地址
munmap返回e
失败mmap返回MAP_FAILED
munmap返回-1
错误码存在errnoiocotl
函数头文件:
#include <sys/ioctl.h>
函数原型:
int ioctl(int fd, unsigned long request, ...);
函数功能: 操作设备参数
函数参数: fd:待操作设备的文件描述符
request :设备参数(主要依赖相关设备)
…:
函数返回值:成功返回0
失败返回-1,错误代码放在errno