学习嵌入式Linux系统开发实际上是学习用户编程接口API
1、Linux系统开发是指通过内核提供的服务实现相应的功能
Linux系统构成:用户空间,内核空间
2、划分空间的目的
分成两个空间是为了防止用户修改内核中的内容,使得原本应该实现的功能无法实现。为了保护内核中核心数据不发生变化,保护内核。
用户空间不能随意访问内核空间
3、用户如何访问内核空间
系统调用:内核提供的安全访问机制。 其作用为使用户空间可以访问内核空间并获取服务而硬件中断和软件中断也可以进入内核空间
4、用户如何发送系统调用
调用系统提供的函数接口
API:用户编程接口
通过学习文件操作、进程、线程操作(多任务)、网络访问、设备访问这些来开发应用软件
I/O技术
perror()函数,可以自动换行,用于打印系统的错误信息
errno 系统全局变量,用于保存系统调用的错误值
(1)使用creat所需的头文件
#include <fcntl.h> // 提供open()函数
#include <sys/types.h> // 提供mode_t类型
#include <sys/stat.h> // 提供open()函数的符号
#include <unistd.h> // 提供close()函数
定义函数:int creat(const char * pathname, mode_tmode)
creat(“hello.txt”,0655)格式为函数名 形参 返回值,其中0655指的是文件的类型,这个函数用于创建文件
(2)使用open函数所需头文件
#include <fcntl.h>
定义函数:int open(const char * pathname, int oflag, … )
对于 open 函数来说,第三个参数(…)仅当创建新文件时才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
O_APPEND 每次写操作都写入文件的末尾
O_CREAT 如果指定文件不存在,则创建这个文件
O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
open(“hello.txt”,O_RDWD)打开hello.txt文件,可读可写。
如果没有文件,也可以添加O_CREAT来创建相应的文件,并可以添加返回值来确定文件类型。
(3)使用write所需头文件
#include <fcntl.h>
定义函数 ssize_t write(int fd,const void* buf,size_t count);
参数说明:
fd : 是文件描述符(write所对应的是写,即就是1)
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数
成功:返回写入的字节数
失败:返回-1并设置errno
(4)使用read函数所需头文件
#include<unistd.h>
ssize_t read(int fd,void*buf,size_t count)
参数说明:
fd: 是文件描述符
buf: 为读出数据的缓冲区;
count: 为每次读取的字节数(是请求读取的字节数,读上来的数据保
存在缓冲区buf中,同时文件的当前读写位置向后移)
(5)所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了O_APPEND 。
使用 lseek 函数可以改变文件的 cfo 。
参数 whence 为下列其中一种:
SEEK_SET 参数offset 即为新的读写位置.
SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或 SEEK_END 时, 参数offet 允许负值的出现.
(6)close(int fd)关闭文件