我无法理解这个结果

时间:2014-11-15 16:22:29

标签: c linux system-calls

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main(void)
{
   printf("%d\t", 1);
   write(1, "Acorn\n", 6);
   printf("%d\t", 2);
   write(1, "Book\n", 5);

   return 0;
}

我想得到以下结果。

1   Acorn

2   Book

但以上代码的结果如下。

Acorn

Book

1        2

我无法解决这个问题。我对此很认真。

如何制作首先打印结果的代码呢?

2 个答案:

答案 0 :(得分:2)

stdio已缓冲。您需要在每次调用write(1,之前致电fflush(3) ...(因为它是syscall),或者以printf结束每个\n格式字符串(因为 stdout 通常是行缓冲)。

顺便说一句,您可以使用snprintf(3)填充字符串缓冲区,然后再填充write(2)它。另见fdopen(3)&amp; dprintf(3)&amp; setvbuf(3)&amp; asprintf(3) ......

答案 1 :(得分:1)

printf的输出卡在输出缓冲区中。为了与write互操作,您需要刷新:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main(void)
{
   printf("%d\t", 1);
   fflush(stdout);
   write(1, "Acorn\n", 6);
   printf("%d\t", 2);
   fflush(stdout);
   write(1, "Book\n", 5);

   return 0;
}