系统调用的基本原理允许请求size_t但只有ssize_t的结果?

Val*_*ron 9 c unix linux

考虑:

ssize_t write(int fd, const void *buf, size_t count);
Run Code Online (Sandbox Code Playgroud)

结果必须在出错时将其签名为-1,等等,因此为ssize_t.但是,当要求超过ssize_t的结果未定义时,为什么允许请求为无符号数量(两倍大)?

由于没有检查计数参数的有效性,内核是否有重大的优化?或者是其他东西?

Cub*_*bbi 6

根据该文件ssize_t write(int fildes, const void *buf, size_t nbyte)

如果nbyte的值大于{SSIZE_MAX},则结果是实现定义的.

因此,每个特定实现可以不同地处理这种情况 如果某些实现只是设置,我不会感到惊讶EFBIG.

至于基本原理,或许size_t只是表示缓冲区大小的最佳类型,在语义上?它声明这个论点是一个非负的大小,没有别的.


unw*_*ind 5

我认为它很好,因为size_tsizeof运算符返回的值的类型,这允许这样的调用:

char buffer[1 << 20];
ssize_t wrote;

wrote = write(fd, buffer, sizeof buffer);
Run Code Online (Sandbox Code Playgroud)

如果函数采用签名版本,则需要进行强制转换.此外,正如其他人所指出的那样,语义上这些函数不能接受负值,因此接受它们并没有多大意义.