パイプを使用して、exec されたプログラムの stdout を読み取ります。
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]);
}
stdout から読み取るために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;
}
このようにする理由は、プログラムがどれだけのテキストを事前に吐き出すかわからないためであり、過度に大きなバッファを作成してメモリを浪費したくないからです。私はあるのだろうかと思っています:
- これを書くためのよりクリーンな方法。
- これを行うためのよりメモリまたは速度効率の高い方法。