Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读写函数中的系统调用_C - Fatal编程技术网

C 读写函数中的系统调用

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

我读过教科书(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(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
vs
open
等相同)。参数有一点特别,它是在一个名称中。

read
write
本身就是系统调用的直接调用。不要与标准IO例程相混淆。
fread
fwrite
。哦,明白了,unbuffered是手动定义BUFFSIZE。你能把评论转达给我吗@user58697@Sawajiri根据请求。
读取
或写入是否也会占用内核中的缓冲缓存或直接写入磁盘?