小编uni*_*eid的帖子

当进程请求输入或输出到屏幕时,tty 会做什么?

我读过很多关于 tty 的帖子。都是从tty这个名字的历史原因说起。请忽略这一点,只描述目前存在的 tty 系统。然后他们讨论 tty 是一个文件,并且在终端中启动的进程的 stdin、stdout 和 sterr 都映射到该文件。三个文件如何映射到一个文件?

有人说 tty 允许在按下 Enter 键之前进行行编辑,并执行其他行规则操作。有一篇博客文章说每个 tty 都有自己的 stdin 和 stdout 。Linus Akesson 的博客文章(我仍在努力解决)解释说,内核中实际上有一个 tty 驱动程序一个 tty 设备文件。然后是控制终端、会话、终端仿真器、原始模式和熟模式、pty 等等。

为了更好地理解 tty 是什么,有人可以向我解释一下在这个简单的情况下会发生什么:打开一个终端并运行默认的 shell。从 shell 运行一个进程并要求输入。

  • 调用 scanf 时会发生什么?
  • 终端如何知道调用了 scanf ?
  • 我们随后看到的终端中的编辑缓冲区(我们输入文本的行) - 它来自哪里?该缓冲区是否存在于 tty 设备文件中并且像打印 stdout 文件一样输出?
  • 哪个进程正在控制该缓冲区?tty 驱动程序?
  • 当我们按下回车键时会发生什么?tty 驱动程序是否将线路“提交”到 tty 设备的 stdin 部分?
  • 流程如何知道输入已提交。

输出部分:当同一个进程输出某些内容时,它是否写入tty设备?但是tty不是已经输出当前编辑缓冲区行了吗?

如果有更好的方法来描述 tty 的作用而不回答上述问题,那么请这样做。如果我错过了一些关键部分,请填写您认为必要的部分。

linux shell terminal kernel tty

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

C++中指针的类型转换和类型转换

我一直试图围绕类型转换和类型转换之间的差异进行思考。我学到的是,基本上当一种类型的基础值或位表示更改为另一种值时,我们已经执行了转换。而在纯类型转换中,我们只是告诉编译器将位模式视为另一种类型。我使用“纯”是因为转换可能会导致转换,在这种情况下它被称为“显式转换”。

我想到了两个例子来说明这种差异。第一的:

float x = 1.5;
float* p1 = &x;
int* p2 = (int*) p1;
int i = *p2;
Run Code Online (Sandbox Code Playgroud)

这里转换指针类型不对指针值执行任何操作。所以它是纯铸造。在这种情况下,它会导致未定义的行为,因为我们根据 f1.5 的位表示获得 int 值,准确地说是 1069547520。

第二:

B* b = new D();
D* d = static_cast<D*>(b);
Run Code Online (Sandbox Code Playgroud)

其中 D 派生自 B。这里的第一行进行了隐式转换。在第二行中,转换实际上是一个转换。这些是转换,因为指针值可能会改变,如果需要调整值以指​​向完整的 D 对象或 B 子对象(我还没有完全理解偏移是如何工作的尽管。)

我在调用用户定义类转换的指针转换时是否正确?如果是这样,那么上面的 static_cast 也执行了转换(明确地),而我读到的这个答案调用完全不同的概念:

/sf/answers/2398829191/ -

标准转换是具有内置含义的隐式转换,并且是独立于 static_cast 或 C 样式转换之类的概念。

另外为什么用户定义的类指针的转换称为标准转换?

我可以问最后一个问题吗?我了解到,当类型相关时,C 风格的强制转换将像 static_cast 一样。这是否意味着 C 风格的强制转换也将在必要时计算偏移量?

c++ pointers casting

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

标签 统计

c++ ×1

casting ×1

kernel ×1

linux ×1

pointers ×1

shell ×1

terminal ×1

tty ×1