Linux应用开发
1.硬件访问---一切皆文件--调用系统IO相关函数操作设备文件从而控制硬件的响应
2.多任务处理(进程、线程)
3.网络编程(基于UDP,TCP协议,利用Socket网络通讯)
4.数据库编程(MySQL数据库)
硬件设备访问
原则: 应用程序是无法直接访问硬件设备的,需要通过内核(OS)提供的系统调用服务来达到访问硬件设备目的,
问题: 那么如何才能使用系统调用服务?
答案:通过系统IO函数(系统IO: 是Linux内核提供的一套函数接口。)
基本概念
1. 什么是文件?
文件是存储在外存储器上的数据集合。
2. Linux系统中文件的标识?
文件描述符;
3. 文件描述符是什么,其本质又是什么?
Linux系统为每个打开(借助于系统IO)的文件会进行一个编号,这个编号就称为文件描述符;
描述符的本质为: 非负整数
每一个应用程序启动后,系统都会默认打开3个文件描述符:
0 标准输入设备
1 标准输出设备
2 标准错误设备
文件访问步骤:
1. 打开文件,(获取文件描述符)
2. 文件操作 (读取,写入,获取文件状态信息)
3. 关闭文件 (释放文件描述符)
照片传输
大多数的操作系统都是小端存储:低数据位存储在低地址上
例如:内存中看到的:36 94 11 00 实际这个数是 00 11 94 36
1.图片是黄色的:
bmp图片它的颜色色值数据排列顺序是: 蓝 绿 红
屏幕像素点颜色色值数据排列顺序是: 红 绿 蓝
2.图片是倒着的
bmp图片的坐标原点是左下角
屏幕的坐标原点是左上角
常用系统IO函数
1. access
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: int access(const char* path,int mode)
函数功能:确定文件或文件夹是否存在,及当前用户对文件的访问权限
函数参数:path: 待操作的文件或目录,若path代表目录,则mode 只能取值为 F_OK
mode: 判断模式,可取值如下:
R_OK:判断文件是否有读权限
W_OK :判断文件是否有写权限
X_OK:判断文件是否有执行权限
F_OK:判断文件是否存在
函数返回值:成功返回0 代表确认的mode是成立的;
失败返回-1 代表确认的mode是不成立的;
错误码存放在 errno 中。
2. open
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: int open(const char* path,int flags)
int open(const char* path,int flags,mode_t mode)
函数功能:打开文件或创建文件
函数参数:path: 待操作的文件
flags: 打开标志,可取值如下:
必选项:
O_RDONLY:只读打开
O_WRONLY :只写打开
O_RDWR: 读写打开
附加项:
O_CREAT: 创建
O_APPEND: 追加写
O_TRUNC: 覆盖写;
mode: 如果是新创建文件,用于指定新文件的访问权限:
简单方式指定:用表示3位的八进制数(例子:0644)
函数返回值:成功返回文件描述符,用于接下来的文件实际操作;
失败返回-1 错误码存放在 errno 中。
例子: open("newfile.txt",O_WRONLY|O_CREAT,0644);
3. read
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: ssize_t read(int fd,void* buf,size_t count)
函数功能:读取文件内容
函数参数:fd: 待操作的文件描述符
buf: 已申请的内存首地址,用于存储读取的数据:
count: 待读取的字节数
函数返回值:成功返回实际读取的字节数
返回0 代表读取到文件末尾;
失败返回-1 错误码存放在 errno 中。
4. write
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: ssize_t write(int fd,const void* buf,size_t count)
函数功能:读取文件内容
函数参数:fd: 待操作的文件描述符
buf: 已申请的内存首地址,用于存储待写入的数据:
count: 待写入的字节数
函数返回值:成功返回实际写入的字节数
失败返回-1 错误码存放在 errno 中。
5. close
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: int close(int fd)
函数功能:关闭文件
函数参数:fd: 待操作的文件描述符
函数返回值:成功返回0
失败返回-1 错误码存放在 errno 中。
6. lseek
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: off_t lseek(int fd, off_t offset, int whence)
函数功能:移动文件位置指针
函数参数: fd: 待操作的文件描述符
offset: 相对于whence 的偏移量
whence: 参考位置,取值如下:
SEEK_SET 文件头
SEEK_CUR 当前位置
SEEK_END 文件末尾
函数返回值:成功返回 文件位置指针相对于文件头的偏移量
失败返回-1 错误码存放在 errno 中。
7. mmap
头文件:#include <sys/mman.h>
函数原型: void* mmap(void* addr,size_t size,int prot,int flags,int fd, off_t offset)
int munmap(void* addr,size_t size);
函数功能:映射/解映射 文件到用户程序的地址空间
函数参数: addr: 映射的内存地址。一般写NULL 让系统决定
size: 待映射的空间大小(字节为单位)
prot: 映射后内存的访问属性,可取值如下一个或多个的组合:
PROT_READ PROT_WRITE PROT_EXEC PROT_NONE
flags: 映射标志:可取值如下:
MAP_SHARED MAP_PRIVATE
offset: 文件中映射数据的偏移量
whence: 参考位置,取值如下:
SEEK_SET 文件头
SEEK_CUR 当前位置
SEEK_END 文件末尾
函数返回值:成功 mmap返回映射后的内存地址
munmap返回0
失败 mmap返回 MAP_FAILED
munmap返回-1 错误码存放在 errno 中。