file - 编程中流的底层原理是什么?

标签 file sockets input stream output

在几种语言中,我们有能力使用输入/输出流来进行诸如从套接字读取或写入之类的事情,但是,物理流究竟是什么,如果使用文件流,它是如何连接到套接字或文件的?
我们大多数人都将流视为连接到文件或套接字的魔线,但到底是什么以及语言如何“连接到这样的结构以输入和输出数据?
谢谢大家!

最佳答案

流本身实际上只是一个固定大小的 FIFO字节队列,可能实现为 circular buffer .该队列的一侧是您的程序,它使用 fwrite()(或类似方法)将字节放入缓冲区,或者对于输入流,使用 fread() 等从缓冲区中删除字节。

队列的另一边是操作系统软件的某些部分;对于可能是文件系统层的文件;对于套接字,它将是 TCP 堆栈;对于标准输出,它可能是 tty 或伪 tty 驱动程序。在您的程序将一些字节写入流后,另一端的 OS 代码被唤醒,它从 FIFO 的另一端获取这些字节并对其进行适当的处​​理(例如将它们写入磁盘,或将它们放入 TCP 数据包并将该数据包发送到以太网卡,等等)

流的内部机制故意尽可能地对您隐藏,这样您的代码就不会依赖于流是如何实现的任何细节。这样,如果操作系统更改,或者您为不同的操作系统重新编译,您的代码(希望)不会中断并需要重写,因为您的代码从未做出任何可能不再正确的假设。

至于语言如何连接到这些操作系统机制,它与您可能使用的任何其他代码库实际上并没有太大区别——就像有人定义了您的代码使用的 fwrite()/fread() API,其他人定义了operating system API fread() 和 fwrite() 的实现者可以调用函数(好吧,实际上它们是 system calls ,但就我们的目的而言,它们类似于函数)。而该操作系统 API 又可以调用 device driver API内核用来与硬件通信的层,等等,对于使事情正常工作所需的尽可能多的层。

一路下来都是乌龟:)

关于file - 编程中流的底层原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341101/

相关文章:

java - 在Java中确定二进制/文本文件类型?

python - 重命名/重构目录中文件名的布局

c++ - 如何在 C++ 编程中从 wget 创建的套接字中检索 RTT?

javascript - Chrome : Mixed content issue for local IP address 192. 168

javascript - document.getElementById ("#").innerHTML = "Hello "+ 用户 + "!";不工作

android - 如何强制Android重新索引手机上的所有照片?

c# - 如何将文件读入保留 CR/LF 的字符串?

python - python wrap_socket 中的 server_hostname 可以保存 IPv4 字符串值吗?

javascript - 检测选择了多少个文件输入,并在达到限制后切换 div

java - 如何在java中旋转一定数量的单词