TOP

系统调用IO和标准IO
2019-09-24 18:10:55 】 浏览:52
Tags:系统 调用 标准

在Linux中一切皆文件,文件操作在Linux中是十分重要的。为此, Linux内核提供了一组用户进程与内核进行交互的接口用于对文件和设备进行访问控制,这些接口被称为系统调用。


系统调用对于应用程序最大的作用在于:


常用的系统调用IO函数有5个:open、close、read、write、ioctl,此外还有个非系统调用IO函数lseek,系统调用IO都是不带缓冲的IO。


open用于创建一个新文件或打开一个已有文件,返回一个非负的文件描述符fd。
0、1、2为系统预定义的文件描述符,分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。


flags参数一般在O_RDONLY、O_WRONLY和O_RDWR中选择指定一个,还可以根据需要或上以下常值:



close用于关闭一个已打开文件。


进程终止时,内核会自动关闭它所有的打开文件,应用程序经常利用这一点而不显式关闭文件。


read用于从打开文件中读数据。


read操作从文件的当前偏移量处开始,在成功返回之前,文件偏移量将增加实际读到的字节数。
有几种情况可能导致实际读到的字节数少于要求读的字节数:


write用于向文件写入数据。


lseek用于设置打开文件的偏移量。


对offset的解释取决于whence的值:


注意:


ioctl提供了一个用于控制设备及其描述符行为和配置底层服务的接口。


标准IO其实就是stdio.h头文件中提供的IO接口,只不过在特定的系统中可能有特定的内部实现。
和系统调用IO类似,标准IO也预定义了三个文件指针stdin、stdout、stderr,分别对应标准输入、标准输出、标准错误。


标准IO是带缓冲的IO,一共有3种类型的缓冲:


一般情况下,系统默认使用下列类型的缓冲:


对于一个打开的流,可以调用setbuf或setvbuf改变其缓冲类型.


对于全缓冲和行缓冲,不管是否满足IO条件,都可以使用fflush函数强制进行IO操作,我们称其为冲洗。


常用的标准IO函数分为以下几大类:


fopen打开由pathname指定的文件,type指定读写方式:



fclose关闭文件,关闭前缓冲区中的输出数据会被冲洗,输出数据则丢弃。


流的定位类似于系统调用IO中获取当前文件偏移量,ftell和fseek函数可用于定位流。


offset和whence含义及可设的值与系统调用IO中的lseek相同,不再赘述,但如果是在非Linux系统,则有一点需要注意:


文本IO有两种:


二进制IO就是fread和fwrite。


二进制IO常见的用法包括:


上述两种用法结合起来,还可以实现读写一个结构数组。


格式化IO包括输入函数族和输出函数族,我们剔除了不常用的与文件指针fp、文件描述符fd相关的API,仅保留常用的3个输出函数和2个输入函数。


PS:sscanf在实际工程中有一个实用的小技巧:串口接收的一条报文,可以根据串口协议,使用sscanf提取各个字段,从而快速便捷的进行报文解析。



系统调用IO和标准IO https://www.cppentry.com/bencandy.php?fid=54&id=262279

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++类中的函数重载实例 下一篇C++中类的静态成员变量和静态成员..