我正在阅读linux内部和系统调用,我对术语IO Stream
感到很沮丧(这是一种耻辱,因为我是一名经验丰富的程序员)。
我对 IO流实际上是什么的最好猜测是,它是从一个文件抽象中将数据作为字节序列传输的操作到另一个。
要明确这不是关于缓冲和流媒体之间差异的问题。
缓冲是一种实现。使用它是因为从设备到内存的传输速度很慢,并且不需要每隔几个字节执行一次,因为:
我想做一些分析,所以我查看了python文档并在一个简单的strace
上做了open
:
io.open(file,mode ='r',buffering = -1,encoding = None,errors = None,newline = None,closefd = True)
打开文件并返回相应的流。如果无法打开文件,则会引发IOError。
据推测,对于文本文件,这将是io.TextBase。
strace
的结果是:
#!/usr/bin/env python3
with open('./sample.txt') as f:
print(f.read())
...
# returns 3 which is the first available file descriptor
openat(AT_FDCWD, "./sample.txt", O_RDONLY|O_CLOEXEC) = 3
# check it's not a directory and lseek to 0
lseek(3, 0, SEEK_CUR)
read(3, "streams of screams because I've "..., 46) = 45
read(3, "", 1) = 0
write(1, "streams of screams because I've "..., 46streams of screams because I've read too much
) = 46
close(3)
因此,python解释器正在从当前工作目录中执行openat
,因为我在文件路径上使用了 ./ 。然后进行一些检查并lseek
将标记移动到文件中的第一个字节。
然后read
为文件,write
为 stdout 。
让我感到困惑的是,我认为是python文档中的一行说返回相应的流。
TextBase
类的含义是什么,使其成为相应的流?