我使用管道读取了执行程序的标准输出:
int pipes[2];
pipe(pipes);
if (fork() == 0) {
dup2(pipes[1], 1);
close(pipes[1]);
execlp("some_prog", "");
} else {
char* buf = auto_read(pipes[0]);
}
要从标准输出读取,我有一个函数auto_read
可以根据需要自动分配更多内存。
char* auto_read(int fp) {
int bytes = 1000;
char* buf = (char*)malloc(bytes+1);
int bytes_read = read(fp, buf, bytes);
int total_reads = 1;
while (bytes_read != 0) {
realloc(buf, total_reads * bytes + 1);
bytes_read = read(fp, buf + total_reads * bytes, bytes);
total_reads++;
}
buf[(total_reads - 1) * bytes + bytes_read] = 0;
return buf;
}
我这样做的原因是我不知道程序会提前吐出多少文本,而且我不想创建一个过大的缓冲区并成为内存占用者。我想知道是否有:
- 一种更简洁的方式来写这个。
- 执行此操作的内存或速度效率更高的方法。