小编Las*_*ssi的帖子

为什么应该将 fork() 设计为返回文件描述符?

在他的关于网页自管绝招,丹·伯恩斯坦解释了竞争条件select()和信号,提供一个解决办法,并得出结论认为,

当然,正确的做法是fork()返回文件描述符,而不是进程 ID。

他的意思是什么 - 是否能够select()在子进程上处理其状态更改,而不必使用信号处理程序来获取这些状态更改的通知?

signals file-descriptors fork

16
推荐指数
3
解决办法
2805
查看次数

为什么 XTerm 支持 63 个功能键?

根据这个终端模拟器及其键码表,新版本的 XTerm 可以识别从 F1、F2、F3 到 F63 的功能键。大多数键盘只有 F1..F12 范围内的物理功能键。额外键的目的是什么?是否存在从物理键或鼠标按下到这些功能键编号的(半)标准映射,如果没有,它们是如何触发的?

我的印象是,在传统的终端用语中,所有特殊键,包括方向键、home/end 等都称为功能键(而我们这些在 PC 上长大的人只会认为 F1..F12 是功能键键)。但是,XTerm 还单独讨论了这些命名键(例如kUP,该表中的向上箭头键)。

terminal keyboard xterm

5
推荐指数
2
解决办法
762
查看次数

为什么终端模拟器仍然出现屏幕闪烁?

当终端模拟器绘制基于文本的应用程序时,为什么仍然存在视觉伪影?这适用于渲染 3D 游戏和 GUI 窗口(包括无伪影的抗锯齿矢量字体)的最新计算机。

我经常看到以下工件,它们揭示了屏幕更新过程的中间步骤:

  • 终端光标运动(更新期间光标在屏幕上闪烁或跳跃)
  • 撕裂(屏幕的一部分显示旧内容,而其他部分显示新内容)
  • 滚动(滚动是明显的,而不是立即显示新的滚动位置)

这些伪影仅在亚秒间隔内出现,并且在大多数屏幕更新期间不会出现,但在无闪烁 GUI 上长大的我仍然想知道如何避免它们。一旦开始绘制更复杂的屏幕,上述所有工件(滚动除外)都可以在以下 ASCIInema 视频中看到:MapSCII - 控制台中的整个世界!

我也不是特别谈论更新缓慢。如果更新始终是即时的,那就太好了,但由于网络和处理延迟,这并不总是可行。我在这里的意思是,部分绘制的屏幕通常会短暂可见。在大多数现代 GUI 中,仅向用户显示完全完成的屏幕,并且部分绘图的工件非常罕见。

我的印象是终端仿真管道是这样的:

  1. 用户按下键盘上的某个键
  2. 内核将按键从键盘驱动程序传递到窗口系统
  3. 窗口系统将按键传递给终端模拟器
  4. 终端模拟器将按键传递到伪终端 (pty) 内核设备
  5. Pty 解释按键并将结果传递给基于文本的应用程序
  6. 应用程序响应按键执行命令
  7. 应用程序将新屏幕(字符单元网格)渲染到内部缓冲区
  8. 应用程序调用curses或其他库将字符单元格网格转换为 ANSI 转义码,从而在终端上呈现等效屏幕
  9. 库将这些 ANSI 转义码写入 pty 设备
  10. Pty 以某种方式处理写入的数据
  11. 终端模拟器从 pty 中读取一些块中已处理的数据
  12. 终端模拟器调用窗口系统在终端窗口中呈现 ANSI 转义码的结果

上述哪一个步骤可以减慢进程速度,使终端模拟器向我们显示中间渲染步骤,而不是仅显示最终结果?

  • 硬件终端(串行端口连接)的速度似乎是由它们的波特率决定的,波特率可以改变,tcsetattr()但我从多个来源读到,波特率设置对终端使用的伪终端(pty)设备没有影响模拟器。这是否意味着 Unix 内核不会故意限制 pty 通信的速率?

  • 应用程序或渲染库(curses 等)是否会在多次写入中发送文本和 ANSI 代码,而不是尝试只用一次写入write()

  • Unix 内核对其内部 I/O 缓冲区有大小限制,这会影响通过管道无阻塞发送的最大数据量等。这是否会影响渲染具有大量细节的终端屏幕(一屏文本、大量颜色等)?我想象组合的文本和 ANSI 转义码可能会产生大量数据,以至于无法放入 pty 驱动程序的缓冲区中,这会将屏幕更新分为应用程序的多个写入操作和终端仿真器的多个读取操作。如果终端仿真器急于在处理下一次读取之前显示每次读取的结果,这将导致显示闪烁,直到处理完一批中的最终读取。

  • 终端模拟器或 pty 驱动程序是否故意设置批处理超时,以便它们的行为更接近地模仿硬件终端,感觉更自然,或者解决一些被认为比显示速度更重要的其他问题?

最近,人们做出了一些努力来制作渲染速度更快的新终端模拟器(例如,通过将字体预渲染到视频内存中的 OpenGL 纹理中)。但这些努力似乎只是在计算网格后加快了将字符单元格网格渲染到屏幕位图上的速度。 …

performance terminal buffer

5
推荐指数
1
解决办法
3441
查看次数

如何模拟NeWS窗口系统

有没有一种相当简单的方法可以在当前的计算机上运行NeWS(网络可扩展窗口系统,一种由 Sun 公司的研究人员在 20 世纪 80 年代开发的基于 PostScript 的窗口系统)?

emulation x11 graphics postscript

5
推荐指数
1
解决办法
696
查看次数

umask 中的字母“u”是什么意思?

是“用户面具”还是什么?

维基百科没有详细信息,但表示该功能自 1978 年以来一直存在于 Unix 中。

POSIX 只是说它是“文件模式创建掩码”。

umask terminology history historical-unix

1
推荐指数
1
解决办法
438
查看次数