C 读写函数中的系统调用
我读过教科书(Unix环境下的高级编程) 与我们在第5章中描述的标准I/O例程不同,本章中描述的功能通常被称为无缓冲I/O术语无缓冲意味着每次读或写操作都会调用内核中的系统调用。这些无缓冲I/O函数不是ISO C的一部分,而是POSIX.1和单个UNIX规范的一部分 我对术语unbuffered(无缓冲)感到困惑,它意味着每次读或写操作都会调用内核中的系统调用。 读写功能是C 读写函数中的系统调用,c,C,我读过教科书(Unix环境下的高级编程) 与我们在第5章中描述的标准I/O例程不同,本章中描述的功能通常被称为无缓冲I/O术语无缓冲意味着每次读或写操作都会调用内核中的系统调用。这些无缓冲I/O函数不是ISO C的一部分,而是POSIX.1和单个UNIX规范的一部分 我对术语unbuffered(无缓冲)感到困惑,它意味着每次读或写操作都会调用内核中的系统调用。 读写功能是 ssize_t read(int fd, void *buf, size_t nbytes); ssize_t write
ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, const void *buf, size_t nbytes);
我在它们的参数中找不到任何特殊的东西,哪个参数是系统调用?通常,这些是系统调用。可以想象,它们可能只是一个正常的函数,使用其他系统调用来完成工作(例如,read
调用底层的一组较小的操作),UNIX及其兄弟系统倾向于一对一地映射
但无缓冲I/O的基本思想是不进行缓存
当您以非缓冲方式读写数据时,数据会立即发送到底层(系统调用中提到的)或从底层检索
相比之下,缓冲方法可以在写入数据之前缓存数据,或者读取的数据比预期的要多,这两种方法都可以提高效率
例如,请参见以下(伪代码)writebuffered
:
def internal buffer size 1024 initially empty
def function writebuffered, accepts data:
for each char in data:
if internal buffer is full:
write internal buffer
empty internal buffer
append char to internal buffer
您可以看到,只有当内部缓冲区已满时,它才会进行系统调用(写入),从而导致系统调用总数减少。显然,在现实生活中,您不会一次处理一个字符,但是处理较大的块会使代码变得不必要的复杂。这里的目的只是显示缓冲
同样,在读取(例如,27个字符)时,系统调用可能会获得更大的数量(比如1K),并将其保存在readahead缓冲区中以备以后使用,因为您可能希望读取更多内容
随后的读取(假设小于或等于
1K-27
字节)将不必进行另一次系统调用来获取数据,它只需从readahead缓冲区获取数据。系统调用非常昂贵,因此标准IO库尽可能延迟它们,例如通过内部缓冲输出。当它不能再缓冲时,它最终调用一个系统调用
此缓冲区通常与文件
指针相关联,因此经验法则是采用文件*
的函数进行缓冲,采用原始int
文件描述符的函数进行系统调用。这只是一个惯例,不再是了
Posix术语试图用
f
作为标准IO例程的前缀,例如fwrite
,而原始系统调用是write
(与fopen
vsopen
等相同)。参数有一点特别,它是在一个名称中。read
和write
本身就是系统调用的直接调用。不要与标准IO例程相混淆。fread
和fwrite
。哦,明白了,unbuffered是手动定义BUFFSIZE。你能把评论转达给我吗@user58697@Sawajiri根据请求。读取
或写入是否也会占用内核中的缓冲缓存或直接写入磁盘?