1
我使用管道讀取exec'd程序的stdout:更好的方式來讀取一個exec'd程序的stdout用C
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;
}
我之所以做這種方式是我不知道這個程序是多少文本要提前出局噴涌,我不希望創建一個過大的緩衝區,併成爲回憶豬。我想知道是否有:
- 一個更清潔的方式來寫這個。
- 這樣做的內存或速度更快的方式。
嗯不錯,我會用這個。那緩衝區呢?我想我應該仍然使用'auto_read',因爲我不知道這個命令會打印多少? –
@VladtheImpala注意到'while'循環。它會讀取,直到程序不再輸出,並將其輸出到控制檯。如果你需要在內存中輸出的全部內容,可以考慮將輸出寫入一個文件,然後'mmapp''。如果你想要一個嘖嘖的話,就說,我會寫一個。 –
是的請!那太好了! –