【发布时间】:2020-03-09 00:29:49
【问题描述】:
我有兴趣找出在 Linux 上检查读取和写入系统调用的返回值的最佳方法。根据手册页,例如写入:
成功完成后,write() 和 pwrite() 将返回 实际写入与 fildes 关联的文件的字节数。 此数字不得大于 nbyte。否则,-1 应为 返回并设置 errno 以指示错误。
供阅读:
成功时,返回读取的字节数(零表示结束 文件),并且文件位置由这个数字提前。它不是 如果此数字小于请求的字节数,则会出错; 例如,这可能会发生,因为实际上可用的字节更少 现在(可能是因为我们接近文件结尾,或者因为我们 正在从管道或终端读取),或者因为 read() 是 被一个信号打断。出错时,返回 -1,并设置 errno 适当地。在这种情况下,未指定文件是否 位置(如果有)发生变化。
这让我想知道:
if (ret < 0) {
// see strerror
}
或
if (ret == -1) {
// see strerror
}
哪一个是要走的路,为什么?每个手册页,在我看来,从功能的角度来看,这些是完全相同的。这样对吗?我猜唯一的区别是第一个语句应该使用比较器,这需要更多资源。我对这个假设是否正确?请与我分享你的想法。谢谢
【问题讨论】:
-
我更喜欢第一个,因为它稍微灵活一些(例如,如果规范发生了演变,并且用另一个负值定义了另一种错误),但我认为这只是口味问题因此我认为这个问题不属于...
-
-1 明确定义为错误返回值。所以你应该与 -1 进行比较。如果有
#define FILEIO_ERROR -1,您将与FILEIO_ERROR进行比较。 -
因为定义得这么明确,所以没有防御性编程的情况,你会比较
<0 -
我也更喜欢
ret < 0支票。比较< 0可能会产生更少的机器代码,因为它只需要检查符号,而不必与特定值进行比较。对于read和write,您还应该将返回值与您想要写入或读取的数据量进行比较,因为函数不需要在一次调用中读取或写入所有数据。 -
@Bodo 我认为 Paul 喜欢 -1 check
标签: c coding-style