基本概念
1.嵌入式Linux系统开发:通过内核提供的服务实现相应的功能。
嵌入式LinuxC开发相当于“会看使用说明书”。
2.Linux系统空间划分:用户空间,内核空间
-用户空间不能随便访问内核空间
-划分空间的目的:保护内核空间不能被用户空间随便访问
3.系统调用:内核提供的安全访问机制;
硬件中断,软件中断
作用:使用户空间可以访问内核空间并获取服务
4.用户如何发送系统调用?
——必须发送文件调用
调用系统提供的函数接口
API:用户编程接口
5.文件描述符——文件id
动态分配:只有当操作这个文件时,系统才会给你分配文件描述符
非负整数:从3编号开始
0,1,2这三个文件描述符有其他作用
无缓冲访问文件(系统调用)的各种API
——(creat、read、write、open、lseek、close)
1.creat函数——创建文件
所需头文件:
#include<stdio.h>//c语言所需头文件
#include<sys/types.h>//类型定义
#include <sys/stat.h>//文件信息
#include <fcntl.h>
基本格式:
int creat (const char *pathname, mode-t mode) ;
函数传入值:
pathname:文件名
mode-t mode:文件权限
一些常用基本权限:
S_IRUSR 可读
S_IWUSR可写
S_IXUSR 可执行
S_IRWXU 可读可写可执行
当然也可以直接用上 0655 0表示8进制,6表示当前文件可读可写,5表示其它文件可读可执行(r 可读,w可写,x可执行,r=4,w=2,x=1)
一个函数的基本组成为函数名,形参,返回值
函数返回值:
成功:返回文件描述符
失败:-1
所以调用完一个函数要检查是否成功
检查错误使用函数perror(自动换行且打印系统的错误信息)
例:创建名为hello.txt的文件,并检错。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = creat ("hello.txt",0655);
if(fd == -1)
{
perror("creat file error!");
exit(1);
}
return 0;
2.open函数——打开文件
所需头文件:
#include<stdio.h>//c语言所需头文件
#include<sys/types.h>//类型定义
#include <sys/stat.h>//文件信息
#include <fcntl.h>
基本格式:
int open( const char pathname,int flags);
int open( const char pathname ,int flags,mode-t mode);
函数传入值:
pathname:被打开文件名(可包括路径名,缺省时为当前目录)
flags:文件打开的方式,参数可以通过“|”(或)组合构成,但前3个参数不能互相重合。
mode _t mode:被打开文件的存取权限,为8进制表示法(调用O_CREAT才需要)。
一些常用基本权限:
O_REONLY:只读方式打开文件
O_WRONLY:可写方式打开文件
O_RDWR:读写方式打开文件
O_CREAT:如果文件不存在时就创建一个新文件,并用第三个参数为其设置权限。
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误信息。这一参数可测试文件是否存在。
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么会先全部删除文件中原因数据。
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾。
注意:
可以用open代替creat操作,即文件打开的方式中加上O_CREAT
例:
将上例改为
int fd = open("hello.txt",O_RDWR | O_CREAT | O_APPEND , 0644);
3.write 函数——将内容写入文件
所需头文件:
#include<unistd.h>
基本格式:
int write(int fd,void*buf,size_t length)
函数传入值:
fd:文件描述符
buf:指定存储器写入数据的缓冲区
length:指定读出的字节数
即将buf中length长的内容写入fd中
可以通过函数:
memset(buffer,0,sizeof(buffer))
来清空缓冲区buffer
例:
char buffer[1024] = "hello world";
int w_len = write(fd, buffer, strlen(buffer));
4.read函数——读取文件内容至缓存区
所需头文件:
#include<unistd.h>
基本格式:
read(int fd, void *buf, size-t count)
函数传入值:
fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定读出的字节数
即将buf中length长的内容写入fd中,和write的操作相反
例:
int r_len = read(fd, buffer, sizeof(buffer));
5.lseek函数—— 控制读写位置
所需头文件:
#include<unistd.h>
#include<sys/types.h>
基本格式:
int lseek(int fd,off_t offset,int whence)
函数传入值:
fd:文件描述符
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)
whence:当前位置的基点:
一些常用基本权限:
SEEK_SET:当前位置为文件开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量大小
例:
lseek(fd,0,SEEK_SET);//指向这行开头
lseek(fd,0,SEEK_END);//计算文件内容长度
6.close函数——关闭文件
基本格式:
close(fd);
用在编程结尾处
例:
int fd = open("hello2.txt",O_RDWR | O_CREAT | O_APPEND , 0644);
close(fd);