gpt4 book ai didi

将 X 字节写入文件描述符的正确方法,其中 X 是无符号 64 位整数

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:59 27 4
gpt4 key购买 nike

考虑以下 C 函数:

static void                                                      
write_buf_to_disk(int fd, void *buf, __u64 size) {
const char* char_buf = buf;
__u64 written = 0;
while (size > 0) {
ssize_t res = write(fd, char_buf, size);
if (res == -1) {
if (errno == EINTR) {
// Write interrupted before anything written.
continue;
}
err(EXIT_FAILURE, "write");
}
written += res;
char_buf += res;
size -= res;
}
}

该函数从 buf 中读取字节,直到写入请求的字节数。 size 的类型不受我控制,必须是 __u64

由于 ssize_t__u64 之间的摩擦,我不认为这是可移植的。

ssize_t 来自一个相当模糊的 POSIX 扩展,AFAICS 保证它是:

  • 至少 16 位宽
  • 签署
  • size_t 大小相同

所以理论上 ssize_t 可能(我知道不太可能)512 位宽,这意味着 written += res 调用未定义的行为。

如何以便携方式防范这种情况?

最佳答案

res 不会高于 write 的第三个参数,所以你所要做的就是将 write 的第三个参数限制为不大于 res (ssize_t) 可以存储的最大正值。

换句话说,替换

ssize_t res = write(fd, char_buf, size);

size_t block_size = SSIZE_MAX;
if (block_size > size)
block_size = size;

ssize_t res = write(fd, char_buf, block_size);

你得到:

static void
write_buf_to_disk(int fd, void *buf, __u64 size) {
const char* char_buf = buf;
size_t block_size = SSIZE_MAX;
while (size > 0) {
if (block_size > size)
block_size = size;

ssize_t res = write(fd, char_buf, block_size);
if (res == -1) {
if (errno == EINTR)
continue;

err(EXIT_FAILURE, "write");
}

char_buf += res;
size -= res;
}
}

关于将 X 字节写入文件描述符的正确方法,其中 X 是无符号 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47515228/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com