c - 为什么 termcaps 在 `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);
}
但这是?
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
andputs
是缓冲的,而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
对每个打开的文件执行 an ——包括诸如stdout之类的流)。
虽然您原则上可以构造一个具有极长字符串的 termcap,但 termcap 描述应该限制为 1023 个字节(甚至 terminfo 描述通常限制为 4096 个字节),而标准 I/O 缓冲区大小通常是该大小的几倍限制,所以如果没有大量工作(即更改运行时......),您将不会看到这些tputs
调用被写出来。
推荐阅读
- react-native - 显示上一屏元素的 DOM [Appium]
- opentok - Opentok 在视频会议中静音/取消静音和打开/关闭订阅者视频的事件是什么
- lua - 没有括号的函数lua c ++
- c# - 如何将字符串转换为 blazor 中的组件?
- javascript - 如何在vuejs中以编程方式将类添加到相应输入元素上的焦点事件?
- r - 未能使用 diagrammeR 的 grViz 将字符串替换与 sprintf 和类似 Razor 的语法结合起来用于流程图
- sql - 在oracle中将具有多行的单列转换为多列
- django - Django 函数包含多个带返回的函数
- google-api - 如果我的 GSuite 帐户被撤销,我如何访问“OAuth 同意屏幕”?
- python - 在熊猫数据框中创建不同变量的滚动总和和平均值