系统编程之文件IO(七)——0,1,2三个文件描述符与库函数和系统调用的区别

简介: 系统编程之文件IO(七)——0,1,2三个文件描述符与库函数和系统调用的区别

一、0,1,2三个文件描述符


stderr:终端(无缓冲区)

stdin:键盘

stdout:终端(有缓冲区)


echo hello > /dev/stderr
echo hello > /dev/stdout


文件描述符:

0:stdin

1:stdout

2:stderr

文件指针:stdin:stdin

stdin:stdin

stderr:stderr

stdout:stdout


char buffer[1024];
fgets(buffer, sizeof(buffer) - 1, stdin);
fputs(buffer, stdout);


二、库函数VS系统调用


文件分类

普通文件、目录文件、设备文件、链接文件


库函数(标准IO) > 系统调用API(初级IO)


如何选择库函数、系统调用API的方式(区别)?


0a2653c851af460fa595bd959398a8f1.png


库函数的读写效率优于系统调用(库函数有缓冲式访问),对文件做大量读写操作(库函数)


举例:

系统调用只能一次一次的访问硬件,而每次访问硬件就像是一次中断,每次中断都需要保存那个时候的状态,所以开销很大,需要避免

而在库函数时,访问硬件后直接将磁盘里的东西全部读到缓存区里,之后,软件直接访问缓冲区,不要再访问硬件了


int fread(void *ptr, size_t size, size_t nmemb, FILE *fp)
{
  //read(fd,ptr ,size *nmemb);Linux
  //win:read
}


C语言中有一个内置宏,可以区分是WIN还是Linux


库函数可以跨平台,系统调用不可以,依赖于操作平台


0a2653c851af460fa595bd959398a8f1.png


操作特殊文件,如:设备文件,只能用系统调用

高级IO,文件映射


相关文章
|
4天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
6 0
|
5天前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版操作报错之在执行任务时遇到了一个IO错误,具体表现为无法从本地主机(localhost)下载文件,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5天前
|
存储 Linux 开发工具
【Linux】基础 IO(文件描述符)-- 详解(下)
【Linux】基础 IO(文件描述符)-- 详解(下)
|
5天前
|
存储 Linux C语言
【Linux】基础 IO(文件描述符)-- 详解(上)
【Linux】基础 IO(文件描述符)-- 详解(上)
|
6天前
|
存储 缓存 Unix
【进程IO】详细讲解文件描述符fd
【进程IO】详细讲解文件描述符fd
|
7天前
|
存储 编译器 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
15 0
|
13天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
13天前
|
Java Unix Windows
|
1天前
|
存储 Java API
|
3天前
|
存储 Java
Java IO流:深入解析与技术应用
Java IO流:深入解析与技术应用
217 1

热门文章

最新文章