在我的代码中,我使用popen和cmd' iostat -xk 2 2'。通常,iostat cmd将向stdout输出一个报告,并在间隔2秒内休眠,然后将另一个报告输出到stdout。
当我使用fgets从popen管道读取时,奇怪的是:我只收到第一份报告。 fgets挂在那里,我从未在2秒钟后收到第二份报告。我将函数fgets更改为fgetc但它没有帮助。
这是我的C ++代码:
string iostatCMD = string("iostat -xk 2 2 ");
FILE *iostatFile = popen(iostatCMD.c_str(), "r");
int fd = fileno(iostatFile);
string readall;
while(!feof(iostatFile))
{
char buffer[128];
if (fgets(buffer, 128, iostatFile) != NULL)
{
cout <<buffer;
readall += buffer;
}
}
cout <<"readall = " <<readall <<endl;
我尝试使用Python。它与popen一起工作得非常好,我得到iostat的两份报告而且没有挂起:
subprocess.Popen('iostat -xk 2 2', shell=True, stdout=subprocess.PIPE).communicate()[0];
所以我的问题是如何在C ++中继续读取popen管道的所有输出?