《UNIX环境高级编程》学习心得 三
输入和输出
1、文件描述符
文件描述符(file descriptor)可以理解为内核在某个进程中访问一个文件时,内核向进程返回的一个非负整数。在内核使用open或creat打开一个现有文件或者创建一个新文件时,它都会返回一个文件描述符,并将其作为参数给read或者write用。
2、标准输入、标准输出和标准错误
按惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符(0、1、2),即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。
我的理解:
标准输入就是从终端(Terminal)对应的键盘中输入,标准输出应该就是直接在终端的屏幕上输出,标准错误也是直接显示在终端屏幕上的。
3、不带缓冲的I/O
函数 open、read、write、lseek和close提供了不带缓冲的I/O。这些函数都使用文件描述符。
不带缓冲的I/O指的应该是这些函数是直接进行系统调用,就是用户使用的时候需要自己建立一个缓冲区,然后自己对这个缓冲区进行管理。而标准I/O呢,应该就是系统自己在用户层上建立了一个缓冲区,不需要用户创建,而且这个缓冲区的管理算法是大牛们写好的,非常高效,应该是比一般用户手撕缓冲区高效的多。
有网友总结的数据流向路径是这样的:
无缓存IO操作数据流向路径:数据——内核缓存区——磁盘
标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘
书中有这样的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include "apue.h" #define BUFFSIZE 4096 //缓冲区的长度 int main( void ) { int n; char buf[BUFFSIZE]; //用户自己弄的缓冲区 while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) // STDIN_FILENO 就是标准输入的文件描述符 值为0 //这条语句就是从标准输入里读 if (write(STDOUT_FILENO, buf, n) != n) // STDOUT_FILENO 就是标准输出的文件描述符 值为1//这条语句就是写入标准输出 err_sys( "write error" ); //err_sys 是大师自己写的一个出错处理 if (n < 0) err_sys( "read error" ); exit (0); } |
这个例子呢就是使用不带缓冲的I/O从标准输入读,并向标准输出写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include "apue.h" int main( void ) { int c; while ((c = getc (stdin)) != EOF) // stdin表示标准输入 if ( putc (c, stdout) == EOF) //stdout表示标准输出 与stdin一同在头文件<stdio.h>中定义的 err_sys( "output error" ); if ( ferror (stdin)) err_sys( "input error" ); exit (0); } |
这个例子呢就是使用标准I/O从标准输入读入数据并写到标准输出中去。这里面有个EOF,EOF呢在<stdio.h>头文件里定义,值为-1。getc就是标准I/O函数,函数getc()用于从流中取字符,其原型是 int getc(FILE *stream); 参数*steam为要从中读取字符的文件流。它返回的是所读取的字符。当它读到文件尾而无数据时便返回-1(EOF)。
由于EOF的值为-1,所以也有如下写法:
1 2 3 | while (~ getc ()){ } |
-1的的反码为0,所以该函数在读到文件结束会停止该循环。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)