跟着b站边学边记,加上自己的理解和代码的测试,也算是给自己做个笔记。
1.使用linuxIO和我们直接写程序的区别
我们平常直接写程序,属于在应用层写程序,通过我们的printf传入内核(在这里printf也是通过调用系统函数write进入的驱动层),通过内核的驱动,在硬件层去进行显示。当我们使用IO的时候,我们属于直接在应用层和驱动层之间通过一个write接口进入驱动层,直接通过接口从应用层进入内核层,这一过程省略printf的调用的过程。
2.使用IO去编程的好处,
首先我认为使用IO去编程,即可以实现我们在应用层编写程序的诉求,又能够减少一些没必要的麻烦。这种深入内核的编程的方式其实也是为了我们以后了解内核的一个开始,毕竟我们不能永远停留在应用层去考虑问题。内核就像一个司令官一样,统领着这些在内核的程序,实现统一进程的调配。
3.文件IO:open close
当我们在使用open的时候,如果打开的正确将返回一个标识符,打开的错误将会返回的是-1,标识符就是它的inode号,也就是内核给内核文件的标号。open函数的目的就是打开一个已有的文件或者创建一个尚未存在的文件。它拥有着三个参数,通过下面的图片简单了解。
上面O_APPEND和O_TRUNC两者的不同需要理解一下。
open函数的第三个参数是给文件设置权限,当文件存在时这个选项可以忽略掉,当创建新的文件时,这个设置的权限我们不是想设置成什么样就设置成什么样,和掩码有关系,也就是umask,我相信说到这个umask大家也就瞬间懂了。
上面图中的程序就是通过IO文件的方式去实现touch的功能。
注:在这次的程序中我们新接触了两个头文件,分别是#include”unistd.h” #include”fcntl.h”前者为Linux\UNIX内置头文件,包含了许多系统服务的函数原型,例如read函数,write函数,getpid函数等,它的作用相当于windows系统中的”windows.h”,是操作系统为用户提供的统一API接口,方便系统提供一些服务。后者也是定义了函数原型以及很多宏
4.文件IO:write
Write(int fd,void *buf,size_t count)
三个参数的含义分别为:第一个参数:向哪个文件去写,第二个参数:向这个文件写什么内容,第三个参数:向这个文件中写多少个。函数返回值:实际写进的字节数
这个函数返回值的作用就是,和第三个参数有关系,通过我们第三个参数和实际写进去的字节数的比较我们就可以知道我们是否把想写进去的内容全部写进去。通过下面这个程序创建并向文件中写一个字符串,并且看一下返回值。
5文件IO:read
Read(int fd,void *buf,size_t count)
Read和write正相反,共同点是包含着三个参数,第一个参数:去哪个文件里去读。第二个参数:开辟一个数组,通过指针的方法将内容读到那里面。第三个参数:读多少个字节,这个字节其实我们定义多大的数组就可以写多少,但是真正能够读出多少取决于我们读的这个文件中有多少。这个函数的返回值就是我们读到的数据。
通过上面我们可以看到我们并没有将返回值读出来,这其中的原因是我们在存数据的时候,是栈的过程,栈是有序的,一个地址写上数据后指向下一个数据,当我们将字符串存进去以后,位置指针指向的是最底下,当我们继续读数据的时候,位置指针继续向下移,下面是空的所以不会有任何的数据。
关于堆和栈大家可以参考以下这个连接:
https://blog.csdn.net/qq_33826977/article/details/66476289
6.lseek函数
leek(int fd,off_t offset,int whence),该函数需要用到的头文件:sys/types.h unists.h
功能:调整读写的位置指针
第一个参数:要调整文件的文件描述符,
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(可向前移,可向后移)。
第三个参数:当前位置的基点有三个标志
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。
SEEK_CUR:当前位置为文件指针位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件大小加上偏移量的大小,函数的
返回值:成功:文件当前位置,出错:-1
7.实现简单cp命令
嵌入式Linux应用开发 1.系统编程 文件IO:open close write read lseek 通过文件io实现cp命令
最新推荐文章于 2024-08-14 15:09:27 发布