c语言 - 为什么术语大写在"写入"系统调用之前不起作用?



为什么这个程序的输出没有得到带下划线的

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);
}

差异的原因是putcharputs缓冲,而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调用被写出