【发布时间】:2018-10-24 17:54:12
【问题描述】:
我正在尝试读取一个程序,该程序使用 read() 从文件中读取 N 个字节,并使用 write() 在 STDOUT 中打印它们。问题是,用户还可以指定块大小,默认情况下它是 1024,最多只能达到 1048576。我必须将读取的内容存储在缓冲区中,但该缓冲区不能与我的字节大小相同必须阅读,否则,我可能会创建一个对于堆栈大小来说太大的缓冲区。因此,我创建了一个与块大小一样大的缓冲区,所以我只是读取直到它已满,然后写入然后再次读取到缓冲区的开头。
所有这一切的问题在于它确实无法按预期工作,我很确定必须有更简单的方法来做到这一点。
相关代码:
void run_hd_b (int b, int fd, int BSIZE){
int res_read; //result from write
int res_write; //result from read
int read_bytes = 0;
char buffer[BSIZE];
int i = 0;
int count = 0;
if (b < BSIZE) count = b;
else count = BSIZE;
while (read_bytes < b && (res_read = read(fd, &buffer[i], count)) != 0){
if (res_read == BSIZE){
i = 0;
}
else i = res_read;
read_bytes += res_read;
while((res_write = write(1, buffer, res_read)) < res_read);
}
}
【问题讨论】:
-
如果您担心 VLA 导致堆栈溢出,为什么不直接 malloc 请求大小的缓冲区?
-
@Shawn 因为那样我仍然会受到堆的限制,我的程序将无法读取足够大的文件,我认为
-
这是.. 您无法 malloc 1048576 字节的可能性极小。
-
为什么读入
&buffer[i]而不是&buffer[0]? -
缺少错误处理,这将导致在常见情况下无休止的繁忙循环((
EAGAIN,ENOSPC,EPIPE,...)。write()代码无法正常工作部分写入。在这里没关系,但数据类型错误(read()/write()返回ssize_t,而不是int)。评论令人困惑。