我写了以下内容:
#include <stdlib.h>
#include <stdio.h>
void ExecAsRoot (char* str);
int main ()
{
printf ("Host real ip is:");
ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'");
return 0;
}
void ExecAsRoot (char* str) {
system (str);
}
我的预期输出是:
Host real ip is:7.17.11.29
虽然实际输出是:
7.17.11.29
Host real ip is:
为什么会这样?
答案 0 :(得分:11)
printf
的输出正在缓冲,因为正在打印的字符串不包含换行符。因此,缓冲区在程序结束前不会刷新,因此在输出system
命令后出现。
要刷新缓冲区,请使用fflush
:
printf ("Host real ip is:");
fflush(stdout);
ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'");
如果您希望对stdout
的所有写入都无缓冲,可以使用setvbuf
禁用缓冲:
setvbuf(stdout, NULL, _IONBF, 0); // _IONBF = unbuffered
或更简单:
setbuf(stdout, NULL);
然后,所有对stdout
的写入都会立即显示。