为什么这个程序的输出没有得到带下划线的
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
write(1, "Hello world!n", 13);
tputs(tgetstr("ue", NULL), 1, &putchar);
}
但这个是?
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
puts("Hello world!");
tputs(tgetstr("ue", NULL), 1, &putchar);
}
编辑
事实上,问题在于缓冲区管理!如果我添加fflush
,字符串将正确加下划线
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
fflush(stdout);
write(1, "Hello world!n", 13);
tputs(tgetstr("ue", NULL), 1, &putchar);
}
差异的原因是putchar
和puts
被缓冲,而write
没有。在本例中,
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
write(1, "Hello world!n", 13);
tputs(tgetstr("ue", NULL), 1, &putchar);
}
编写的字符
write(1, "Hello world!n", 13);
很可能首先到达屏幕,因为(与tputs
调用不同(它们是立即写入的。tputs
调用写入的字符存储在缓冲区中(缓冲区通常比tgetstr
返回的字符串大很多(,由于您没有提供其他方法来刷新缓冲区,这些字符由运行时的清理程序在退出时写入。
在没有显式返回语句的情况下,C标准保证它具有与调用exit
(对每个打开的文件执行fflush
,包括stdout等流(相同的效果。
虽然原则上你可以构建一个具有超长字符串的termcap,但termcap描述应该限制在1023字节(甚至terminfo描述通常限制在4096字节(,而标准I/O缓冲区大小通常是这个限制的几倍,因此,如果没有大量的工作(即更改运行时…(,就不会看到那些tputs
调用被写出