IO

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。 在POSIX兼容的系统上,例如Linux系统,I/O操作可以有多种方式,比如DIO(Direct I/O),AIO(Asynchronous I/O,异步I/O),Memory-Mapped I/O(内存映射I/O)等,不同的I/O方式有不同的实现方式和性能,在不同的应用中可以按情况选择不同的I/O方式。

I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。 在POSIX兼容的系统上,例如Linux系统,I/O操作可以有多种方式,比如DIO(Direct I/O),AIO(Asynchronous I/O,异步I/O),Memory-Mapped I/O(内存映射I/O)等,不同的I/O方式有不同的实现方式和性能,在不同的应用中可以按情况选择不同的I/O方式。收起

查看更多
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之文件锁
    前面有讲过竞争冒险的问题,如果有多个进程对文件进行I/O操作,容易产生竞争状态、导致文件中的内容与预想的不一致的问题,由此引入文件锁。 内核提供的锁机制用于对共享资源的访问进行保护,而文件锁是一种应用于文件的锁机制,当多个进程同时操作同一文件时,对文件上锁,来避免多个进程同时操作同一文件时产生竞争状态。 文件锁可以分为建议性锁和强制性锁两种: 建议性锁本质上是一种协议,程序访问文件之前,先对文件上
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之I/O多路复用
    I/O多路复用(IO multiplexing)通过一种机制,可以监视多个文件描述符,一旦某个文件描述符(也就是某个文件)可以执行I/O操作时,能够通知应用程序进行相应的读写操作。I/O多路复用技术是为了解决:在并发式I/O场景中进程或线程阻塞到某个I/O系统调用而出现的技术,使进程不阻塞于某个特定的I/O系统调用。 由此可知,I/O多路复用一般用于并发式的非阻塞I/O,也就是多路非阻塞I/O,比
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之异步I/O
    在I/O多路复用中,进程通过系统调用select或poll来主动查询文件描述符上是否可以执行I/O操作。而在异步I/O中,当文件描述符上可以执行I/O操作时,进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务直到文件描述符可以执行I/O操作为止,此时内核会发送信号给进程。 异步I/O通常也称为信号驱动I/O。 要使用异步I/O,程序需要按照如下步骤来执行: 1.通过指定O_NON
  • 飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O
    1.4.1.1 概念 阻塞I/O顾名思义就是对文件的I/O操作是阻塞式的,即假如对某些类型文件(管道文件、网络设备文件和字符设备文件)进行读操作时,如果数据未准备好、文件当前无数据可读,那么读操作可能会使程序阻塞等待,直到有数据可读时才会被唤醒返回。 普通文件的读写操作是不会阻塞的,不管读写多少个字节数据,read或 write一定会在有限的时间内返回,所以普通文件一定是以非阻塞的方式进行I/O操
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之文件描述符
    open返回得到的文件描述符fd可以进行复制,复制成功之后可以得到一个新的文件 描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行IO操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限。 在Linux系统下,可以使用dup或dup2这两个系统调用对文件描述符进行复制。 1.dup 用于并可以多次复制文件描述符,复制得到的文件描述符与原文件描述符都指向同一个文件表,它们的文件偏移量是一
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之多次打开文件
    在一个进程中多次打开同一个文件,会得到多个不同的文件描述符fd,在关闭文件时也需要关闭全部的文件描述符。 测试: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main()
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之Linux系统的文件管理机制
    静态文件与 inode 文件在没有被打开的情况下一般都是存放在存储设备中,比如硬盘、U盘等存储设备。静态文件则是指:存放在磁盘文件系统中,并且以一种固定的形式进行存放的文件。 文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区储存512字节(相当于 0.5KB),操作系统读取硬盘的时候,不会一个一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之返回错误处理与相关函数
    在程序执行过程中,当判断到某个函数执行失败时,通常会调用return退出程序。在Linux系统下对常见的错误做了一个编号,每一个编号都代表着每一种不同的错误类型,当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给errno变量,每一个进程(程序)都维护了自己的errno变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号,也就意味着下一次的错误码会覆盖上一次的错误码。
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之错误的退出操作
    当程序在执行某个函数时出现错误,如果该错误会导致后续步骤无法正常进行,应该在错误发生时立即终止程序的执行,而不是让程序继续运行下去。 在 Linux 系统下,进程正常退出除了可以使用return之外,还可以使用exit、_exit以及_Exit。 1.3.5.1 exit 该函数是一个标准C库函数,函数会执行一些清理工作,最后调用_exit()函数终止进程。 1.头文件 #include <
  • 飞凌嵌入式ElfBoard-文件I/O的了解探究之I/O缓冲
    前面有提到系统IO和标准IO在缓冲方面的区别,针对缓冲部分,有一些概念和操作函数需要了解。 1.3.2.1 内核缓冲  实际上系统IO在进行文件读写时并不会直接访问磁盘设备,而是仅仅在用户空间缓冲区和内核缓冲区(kernel buffer cache)之间复制数据,而内核会将其缓冲区中的数据写入(刷新)到磁盘设备中。 系统调用与磁盘操作并不是同步的,例如write函数并不会等待数据真正写入到磁盘之
  • 飞凌嵌入式ElfBoard-标准IO接口之刷新缓冲
    1.fflush 用于刷新指定文件的stdio输出缓冲区。 2.头文件 #include <stdio.h> 3.函数原型 int fflush(FILE *stream); 4.参数 stream:表示指定的文件,如果为NULL,则表示刷新所有的stdio缓冲区。 5.返回值 成功返回0,失败将返回一个-1,并且会设置errno来指示错误原因。
  • 飞凌嵌入式ElfBoard-标准IO接口之设置缓冲区
    1.setvbuf 用于以对文件的 stdio 缓冲区进行设置,譬如缓冲区的缓冲模式、缓冲区的大小、起 始地址等。 1)头文件 #include <stdio.h> 2)函数原型 int setvbuf(FILE *stream, char *buf, int mode, size_t size); 3)参数 stream:表示指定的文件。 buf:如果不为NULL,那么buf指向si
  • 飞凌嵌入式ElfBoard-标准IO接口之格式化输入
    格式化输入用于从不同输入源中获取数据并根据格式化字符串format转换为对应的格式代码并存储在对应的类型中。 格式化输入函数:即按特定的格式从特定位置上把数据输入到特定的位置之中。 1.scanf 用于从标准输入流stdin读取格式化数据,并根据参数格式将其存储到附加参数所指向的位置。 1)头文件 #include <stdio.h> 2)函数原型 int scanf ( const
  • 飞凌嵌入式ElfBoard-标准IO接口之检查和复位
    调用fread读取数据时,如果返回值小于参数nmemb所指定的值,表示发生了错误或者已经到了文件末尾(end-of-file),但fread无法具体确定是哪一种情况。在这种情况下,可以通过判断错误标志或end-of-file标志来确定具体的情况。 1.feof 用于检查stream所指文件的end-of-file标志是否存在。 1)头文件 #include <stdio.h> 2)函数
  • 飞凌嵌入式ElfBoard-标准IO接口之格式化输出
    将格式化数据写到标准输出,通常称为格式化输出,除了常见的printf外,还有如下四个函数。 1.printf 将格式化数据输出到标准输出。 1)头文件 #include <stdio.h> 2)函数原型 int printf( const char *format, ... ); 3)参数 format:表示C 字符串,包含了要打印的格式化数据。 ...:表示附加可变参数,根据不同的 
  • 飞凌嵌入式ElfBoard-标准IO接口之文件偏移量
    1.fseek 用于设置文件中位置指针的偏移量。 1)头文件 #include <stdio.h> 2)函数原型 int fseek(FILE *stream, long offset, int whence); 3)参数 stream:要操作的文件指针。 offset:表示以whence为起始点的偏移字节数。 whence:表示offset的起始点位置,可以是以下之一: SEEK_S
  • 飞凌嵌入式ElfBoard-标准IO接口之关闭文件
    1.fclose 用于关闭某个已打开的文件。 2.头文件 #include <stdio.h> 3.函数原型 int fclose(FILE *stream); 4.参数 stream:要关闭的文件指针。 5.返回值 返回0,表示关闭成功;若返回EOF(-1),表示出错。 6.示例:(以只读方法打开ftest文件,再关闭) #include <stdio.h> int ma
  • 飞凌嵌入式ElfBoard-标准IO接口之读文件
    1.fgetc 对单个字符的读操作,只能操作文本文件。 1)头文件 #include <stdio.h> 2)函数原型 int fgetc(FILE *stream); 3)参数 stream:目标文件的文件指针。 4)返回值 若读取成功,返回读取到的字符,若失败或者到达文件末尾,返回EOF(-1)。 5)示例:(以只读方法打开ftest文件,单字节读取内容并打印) #include
  • 飞凌嵌入式ElfBoard-标准IO接口之写文件
    1.write 用于向一个已打开的文件写入特定的内容。 2.头文件 #include <unistd.h> 3.函数原型 ssize_t write(int fd, const void *buf, size_t count); 4.参数 fd:表示要操作文件的文件描述符。 buf:表示要写入数据存放的位置(缓冲区地址)。 count:表示要写入的字节数。 5.返回值 若写入成功,则返
  • 飞凌嵌入式ElfBoard-标准IO接口之打开文件
    1.fopen 用于打开或者创建文件。 2.头文件 #include <stdio.h> 3.函数原型 FILE *fopen(const char * pathname, const char * mode); 4.参数 1)filename:表示想要打开的文件的绝对路径名,或者当前路径下的文件名。 2)mode:表示打开文件用的操作(1-6必选其一,7和8可以省略) "r":以只读

正在努力加载...