c - 读写函数中的系统调用

标签 c

我看了课本(Unix环境高级程序设计)

The functions described in this chapter are often referred to as unbuffered I/O, in contrast to the standard I/O routines, which we describe in Chapter 5. The term unbuffered means that each read or write invokes a system call in the kernel. These unbuffered I/O functions are not part of ISO C, but are part of POSIX.1 and the Single UNIX Specification.

我对术语无缓冲感到困惑,意思是每次读取或写入都会在内核中调用系统调用。

读写函数是

ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, const void *buf, size_t nbytes);

我没发现他们的参数有什么特别之处,哪个参数是系统调用?

最佳答案

系统调用是昂贵的,因此标准 IO 库尽可能推迟它们,例如通过内部缓冲输出。当它不能再缓冲时,它最终会调用系统调用。

此缓冲区通常与 FILE 指针相关联,因此经验法则是采用 FILE * 的函数进行缓冲,而采用原始 的函数>int 文件描述符进行系统调用。这只是一个约定,仅此而已。

Posix 命名法试图在标准 IO 例程前加上 f 前缀,例如 fwrite,而原始系统调用是 write(相同fopenopen 等)。参数没有特别之处,在名字里。

关于c - 读写函数中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53273561/

相关文章:

c - 在 unicode 和 PRAGMA journal_mode 设置时,SqLite 数据库不会关闭

c++ - CUDA gridDim、blockDim 总是用户定义的吗?

c - 在哪里可以找到有关此 .s 文件中的代码的文档?

c - C 中的 while 循环出现问题 - 拒绝输入,但随后第二次接受相同的输入

代码编辑器 - 仍然存在未解析的符号

c - 如何在 Perl API 中内省(introspection)正则表达式

c - C 中的转换和 sqrt() 问题

c++ - 无法打开 UART。确保它没有被其他应用程序使用

c - RtlGenRandom/CryptGenRandom 或其他 WinAPI 以生成加密安全随机数(2018 年第一季度)

c++ - 如何在excel中使用标准输入 '<'?