【问题标题】:Standard Stream and Operating Systems标准流和操作系统
【发布时间】:2018-07-11 01:49:59
【问题描述】:

我对 Streams 很困惑。

1) 操作系统(即 Windows)是否提供通用标准输入流并且所有语言都使用它(即 Java 将其称为 System.in 而相同的标准输入流在 c 中用 stdin 引用)?

是不是键盘有一些端口或物理地址,而操作系统已经存储了它 在某些变量中,当程序需要它时,它会根据语言为 stdin 或 System.in 提供相同的地址?

或,

2) 是不是每种语言都有自己为标准流编写的 API,当我们运行程序时,流会连接到输入设备?

除了数据,该流还有哪些信息?即设备的物理端口或地址或什么?

另外,请说明 System.in get "connected" to program when we run it 是什么意思。这里的“连接”是什么意思?

请分享一些链接。

【问题讨论】:

  • 文件描述符 1 是在进程启动之前为它创建的,写入该进程的任何内容都会写入标准输出。
  • 答案是高度系统特定的。如今,大多数人已经习惯了 Windoze 和 Eunuch 式的脑损伤 I/O,这种 I/O 非常有限。

标签: java c++ c operating-system


【解决方案1】:

定义

“流”是一个包罗万象的词,例如“窗口”。流的所有含义是有某种东西(“设备”)产生顺序数据或接受顺序数据。

例如,我可以通过简单地跟踪要生成的下一个字符是什么来将字符串变成输入流(生成数据)。当我们用完字符时,我们已经到达了流的末尾。 C++:

struct my_hello_stream
{
  static const char* s = "Hello world!";
  int n;
  my_stream(): n(0) {}

  int get()
  {
    if (s[n]) return s[n++];
    return EOF;
  }
};

抽象

每个系统都有自己的抽象流的方式。操作系统通过文件管道字符设备来实现,您可以打开它们进行读取或写入。具体如何完成完全取决于操作系统的设计。请查阅您的操作系统 API 文档。

除此之外,还有一种编程语言,如 C 或 C++ 或 Java 或 FORTRAN——你可以说它。编程语言本身以一种方便该语言用户的方式定义了流。在 C 中,您有一个 FILE*。在 C++ 中,您有 std::iostreams。在 Java 中,您有 I/O streams。无论如何,这在操作系统流之上工作,以从文件中读取和写入数据等。

此外,这些语言特性通常允许您使用这些流接口做更强大的事情,例如将字符序列1234567 转换为原生整数值,并对字符串执行这些操作。

除此之外,还有一些外部库允许我们将诸如互联网连接和与打印机的端口连接之类的东西视为流。操作系统为我们处理的一些东西。有些不是。

tl;博士

这一切都取决于。重要的是您可以访问的抽象——这通常是您的编程语言。因此,请阅读您的编程语言如何期望您打开文件并读取和写入数据,然后表现得好像这是对的。底层实际发生的任何事情都是魔法。

【讨论】:

  • 感谢您的解释。首先我无法理解这一切。但是看了各种博客,现在我明白了你的意思。这对我来说是高层次的解释,但切中要害。
【解决方案2】:

什么是流?

Stream 是一种抽象,既可以是输入源,也可以是输出目的地。例如,在 UNIX 中,一切都是文件,因此您的键盘将由只读文件表示(为什么?)。每当您想从键盘读取内容时,只需使用 read 系统调用,使用键盘文件作为参数。

操作系统(即 Windows)是否提供通用标准输入流和所有 语言使用它(即Java将其称为 System.in 和相同 标准输入流在 c) 中用 stdin 引用?

操作系统仅提供非常基本的功能,例如读写系统调用(取决于操作系统),可用于读取和写入原始字节。所有编程语言都使用此基本功能来创建抽象(例如将原始字节转换为特定字符集或在写入之前缓冲数据)。

【讨论】:

  • 我还有一个问题,它是否像 System.in 从设备中读取(并且该部分被抽象并使用系统调用,如 read(依赖于操作系统)),然后当我们使用 read() 时,我们从 System.in 流中读取?还是 System.in.read() 调用系统调用?请看一下这个链接:journals.ecs.soton.ac.uk/java/tutorial/java/nutsandbolts/…
  • 我不认为我理解你问题的第一部分,但对第二部分的回答是肯定的。
  • 第一部分是关于链接和你的答案,在那个链接中提到输入流读取来自设备的数据,然后我们的程序在我们使用时从输入流中读取字节/字符Syste.in.read 方法。这表明这是一个两步过程。
  • 假设我正在输入输入“Hi”,然后根据该链接,首先输入流将从设备读取输入,此步骤本身将进行系统调用(读取操作系统的功能),然后在第二步,当我们调用 Java I/O API 的 System.in.read() 时,我们将从 InputStream 中读取。那么这是一个两步的过程吗?或者它是一个单步过程,即当我们调用 System.in.read() 时,它本身的系统调用将被调用以从设备读取输入?
【解决方案3】:

当程序开始执行时,操作系统会自动打开三个标准文本流(通道),并为它们提供常量文件指针。 您可以将流视为通道,而不是标准流,我们必须通过一些库函数(如 c 中的 fopen)打开流,它会根据您的程序和指定的文件创建流。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 2014-05-27
    • 2012-02-05
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2011-07-28
    相关资源
    最近更新 更多