嵌入式技术
在linux中一切都叫文件,比如普通文件,设备文件,管道。在应用层,可以用一套文件IO读写文件,其实就是一套能够操作文件的系统调用。文件IO又称为不带缓存的IO,因为文件IO可以直接系统调用陷进内核去执行相应的代码和数据。与之差不多的还有标准IO。基本有:打开、读取、写入、关闭,分别是: open()、read()、write()、close().值得一提的是,文件IO都是基于文件描述符来操作的。
文件描述符
文件描述符是类似文件的唯一ID的整数。每个(程序)进程都包含3个默认的文件:标准输入(STDIN),标准输出(STDOUT),标准错误(STDERR)。分别对应的文件描述符:0、1、2.默认情况下,标准输入连接键盘,标准输出和标准错误连接终端。如果打开了两个文件,那么这两个文件的文件描述符就在2基础上顺序增加。总之,一个文件描述符对应一个文件。
一、打开文件
在对文件进行读写操作之前,必须先打开一个文件,得到这个文件的文件描述符。按照flags标志打开pathname的文件,如果是新建一个文件则需要用到mode,返回这个文件的文件描述符。打开失败返回-1,并设置errno。
1.open的flags参数
必须选定O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)中的一个,互斥 。
除此之外还有以下flags可以与上述flags 用 | 一起用:
O_APPEND : 在每次读写,文件位置指针都被置于文件末尾,保留文件原有内容基础上读写
O_CREAT : 如果pathname不存在时,由内核自动创建。文件存在时候,通常和O_EXCL连用防止竞争创建文件,用此参数时候一定要用上mode参数。
O_EXCL :与O_CREAT连用
O_TRUNC : 只对可写普通文件有效,当普通文件存在时候,把文件内容清空。对于FIFO或者终端设备,该参数被忽略
剩下的一个flags具体用到的时候再来总结。
2.open的mode参数
当使用O_CREAT的时候需要设置文件的权限,比如777。但是(mode& ~umask)才是最终的权限。
umask是系统掩码,用umask可以看到
二、读文件
read()系统调用从fd所指的文件里读取至多count个字节到buf中,返回成功读取的字节数。
特别需要注意的是:open之后文件位置指针指向文件开头,read完之后文件位置指针会移动,如果下一步需要写操作时候,一定要注意这个文件位置指针的位置已经被移动了!
1.read的返回值
返回0 . 标志EOF,文件位置指针已经在文件末尾,没有可读入的数据。
返回-1,可以查看errno的值进一步确定何种调用错误
三、写文件
write()系统调用将buf的数据写入到fd指向的文件中,写入count个,返回成功写入的字节数,并更新文件位置指针。调用错误时设置errno
如果是字符设备,那么文件位置指针总是从开头写
四、关闭文件
不使用文件后都要关闭文件
全部0条评论
快来发表一下你的评论吧 !