3.31课堂总结

1.嵌入式系统开发:通过内核提供的服务实现相应的功能
软件 内核 硬件
c语言程序设计:无os语法;
2.Linux系统空间划分:用户空间,内核空间,
划分空间的目的是:为了保护内核的访问安全;保证用户空间不能随便访问内核;
3.用户空间如何访问内核空间?
必须发送系统调用;
4.用户如何发送系统调用?
调用操作系统提供的函数接口–API:用户编程接口;
文件操作、进程操作(多任务),
1.文件描述符(文件的ID号);
①动态分配,只有当操作这个文件时,系统会分配文件描述符;
②非负整数,从3编号开始,(0,1,2这三个有其他作用);
2.无缓冲访问文件(系统调用)
creat函数:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
creat(“hello.txt”,S_IRWXU); //创建一个hello文本,设置权限;
return 0;
}
int fd=creat(“mm”,0655);//如果创建失败,返回值是-1;
如何找到错误原因?
包含头文件 #include <errno.h>
①errno :系统的全局变量,保存系统调用的错误值;
if(errno == EISDIR) 判断打开的文件是不是目录;
②perror(“create file error!”) //自动换行,打印的系统的错误信息;
open函数
int fd=open(“hello.txt”,0_RDWR); //打开文件,以读写方式打开;
if(fd == -1);//判断文件是否打开成功;
int fd=open(“hello.txt”,0_RDWR | 0_CREAT,0644);//打开文件,不存在就创建,并设置权限;
write函数
第一个参数 文件描述符,第二个参数 数据的地址, 第三个参数 数据的长度;
包含头文件 #include<string.h>
int fd=open(“hello.txt”,0_RDWR | 0_CREAT,0644);
char buffer[1024]=“hello world”;
write(fd,buffer,strlen(buffer));
如果多次次编译write, 结果文件依旧是一句话,因为是从头写入,会将之前的语句覆盖掉;
可以通过0_APPEND,从末尾开始写,这样就可以出现多个句子;
int fd=open(“hello.txt”,0_RDWR | 0_CREAT | 0_APPEND,0644);
验证返回值:
int w_len= write(fd,buffer,strlen(buffer));
if(w_len == -1)
{
perror(“write error!”);
exit(1);
}
read函数
第一个参数 文件描述符,第二个参数 数据的地址, 第三个参数 数据的长度;
int r_len=read(fd,buffer,sizeof(buffer)); //从fd读取数据,放到buffer中;
printf(“read data=%s\n”,buffer);
注意 读写位置是在数据的后面,所以会读不到数据;
如何将读写位置移动?lseek函数;
lsee用来控制读写位置;
每一个已打开文件都有读写位置,通常指向文件开头,若以0_APPEND方式打开,则读写位置在文件尾;
第一个参数 文件描述符,第二个参数 移动的长度,负数表示往前移动,正数表示后移,
第三个参数是位置,SEEK_CUR指 当前位置往后增加n个位移量; SEEK_SET指 先移到开始位置;
SEEK_END 指先移到文件尾,在移动字节数
int fd=open(“hello.txt”,0_RDWR | 0_CREAT,0644);
char buffer[1024]=“hello world”;
int w_len= write(fd,buffer,strlen(buffer));
if(w_len == -1)
{
perror(“write error!”);
exit(1);
}
printf(“write data len =%d\n”,w_len);
lseek(fd,0,SEEK_SET);//
memset(buffer,0,sizeof(buffer));
int r_len=read(fd,buffer,sizeof(buffer)); //从fd读取数据,放到buffer中;
printf(“read data=%s\n”,buffer);
close 函数
close(fd);
补充:返回当前位置距离头的位置;
off_t pos = -11;
int size = lseek(fd,0,SEEK_CUR);
printf(“size=%d\n”,size);
修改写的格式,使其写入三行且换行:
char buffer[1024]=“hello world”;
int i;
for(i=0;i<3;i++)
{ int w_len= write(fd,buffer,strlen(buffer));
if(w_len == -1){
perror(“write error!”);
exit(1);
}
printf(“write data len =%d\n”,w_len);
write(fd,"\n",1);
}
修改读取文件的函数:
read_line(fd,buffer,sizeof(buffer));//读一行
int read_line(int fd,char*buffer,int max_len);
{
int i; int r_len;
char temp;
for(i=0;i<max_len;i++)
{
r_len=read(fd,&temp,1);// 每次读一个字符;
if(r_len == -1)
{
perror(“read data error”);
break;
}
if(r_len == 0)
break;
if(temp == ‘\n’)
break;
buffer[i]=temp;
}
return i;

发布了11 篇原创文章 · 获赞 0 · 访问量 215

猜你喜欢

转载自blog.csdn.net/maxiaotiaobutiao/article/details/105348735