read 系统调用为什么返回 int ?

本文详细解析了操作系统中read系统调用的工作原理,包括其如何读取流中的字节并处理负数表示法,以及如何通过返回值判断是否达到文件末尾。同时强调了避免频繁调用read以提高效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

read 是操作系统提供的一个系统调用。该调用读取流中的一个字节,返回一个 int;这里可以一探究竟。

早期的时候,操作系统设计者认为字节大于等于0,故使用 -1 作为流结尾标志符。而且定义了一个字节就是一个 byte,在内存中使用八位表示。这样,一个 byte 就只能表示0到127对应的编码,显然不够用,聪明的设计者们使用了这一个办法:允许 byte 为负,表示编码的补码,如 -128 表示 编码 128 ,-127 表示编码 129,...... -1 表示 255。于是 byte 表示的编码的范围就变成了 0 到 255,对应 [0,127] U [-128,-1]。

那么问题来了,如果 read 调用返回 byte 数据类型,而 byte 可以为 -1,那么,当返回 -1 时,到底是说流已经 EOF (end of file)了,还是当前读到了一个有效的字符 255(-1)?于是又作了这样的设计:让 read 返回 int,当大于等于 0 时,表示读到了有效的字节,当返回 -1 表示读到了流末尾。read 返回的大于 127 的字节就对应于它们取负的补码。设返回值为 c,则取它的低八位就是表示的编码,也即 c & 0xff 或 (byte)c。


这里要注意一下:系统调用必须通过软中断机制首先进入系统核心,然后才能转向相应的命令处理程序。普通过程调用可以直接由调用过程转向被调用过程。所以要避免多次调用 read,而应该一口气读多个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值