系统编程之文件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月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
182 34
|
3月前
|
机器学习/深度学习 API Python
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
|
4月前
|
网络协议 Linux Go
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
|
8月前
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
65 2
|
9月前
|
网络协议 Java Linux
高并发编程必备知识IO多路复用技术select,poll讲解
高并发编程必备知识IO多路复用技术select,poll讲解
|
9月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
10月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
130 2
|
9月前
crash —— 获取系统的磁盘IO统计数据
crash —— 获取系统的磁盘IO统计数据
|
10月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
82 0
|
11月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
144 0

热门文章

最新文章