[英]Why don't termcaps work before a `write` syscall?
为什么这个程序的输出没有下划线
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
是buffered ,而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
),因为你没有提供其他的方式来刷新缓冲区,这些都是由运行时的清理,因为它退出写入。
如果没有显式 return 语句,C 标准保证它具有与调用exit
相同的效果(它对每个打开的文件执行fflush
包括诸如stdout 之类的流)。
虽然原则上您可以构造一个具有极长字符串的 termcap,但 termcap 描述应该限制为 1023 字节(甚至 terminfo 描述通常限制为 4096 字节),而标准 I/O 缓冲区大小通常是其数倍限制,所以你不会看到那些没有大量工作的tputs
调用(即,更改运行时......)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.