理解从终端读取文件背后的概念

理解从终端读取文件背后的概念

我刚开始学习操作系统模块,这些问题真的让我措手不及。这些问题没有解决方案。

(a)在 Windows 中,启动命令行 shell,例如 cmd。假设您处于包含某些标准文档文件类型的目录中,例如 .doc、.pdf、.ppt 等。只需尝试输入文件名本身即可。

详细来说,这个问题假设在同一目录中有一个 PDF 文件,例如 U5-UnixProcess.pdf(任何 PDF 文件都可以),并且您有一个 PDF 阅读器。以下示例说明了如何从文档启动进程:c:> U5-UnixProcess.pdf

发生了什么?正在运行什么程序?是正在运行 PDF 文件吗?

(b) 解释 Windows 中此功能的理由。

(c) Windows 如何知道如何处理该文件?(提示:使用鼠标右键)。

(d)Unix 有一个相关功能。阅读 execve 的手册页并解释该功能以及如何使用它?

以下是我根据自己的理解给出的答案。我曾尝试寻找答案,但似乎没有资料可以解释如此微妙的问题。

答案

a) 当我们输入文件名时,命令行 shell 会在当前目录中搜索文件名。如果未找到,则它会搜索 PATH 环境变量中列出的目录。找到文件后,它会查找文件的扩展名以找出哪个应用程序处理该文件的类型,如果文件扩展名为 .pdf,则该应用程序将是 PDF 阅读器。之后,它会将该应用程序作为新进程启动,并将文件的名称传递给它。

在整个过程中,运行的是能够处理文件的应用程序,而不是文件本身。

b) 命令行 shell 允许用户访问图形用户界面所提供的以外的更多命令,例如查看隐藏文件。

c) 您可以设置打开文件时使用的默认应用程序,以告诉 Windows 如何处理该文件。如果没有可以运行该文件的应用程序,则该文件将不会打开。

d)我基本上只是抄袭了一段教程点对于这个。不太明白“如何使用它”在这里的应用。

execve()是一个将调用进程转换为新进程的系统调用,其签名为int execve(const char *path, char *const argv[], char *const envp[]);

execve()执行 path 指向的程序。path 必须是二进制可执行文件,或者以“#!interpreter [arg]”格式开头的脚本。在后一种情况下,解释器必须是可执行文件的有效路径名,该可执行文件本身不是脚本,将作为解释器 [arg] 文件名调用。argv 是传递给新程序的参数字符串数组。envp 是字符串数组,通常采用 key=value 格式,作为环境传递给新程序。argv 和 envp 都必须以空指针结尾。当被调用程序的主函数定义为时,它可以访问参数向量和环境int main(int argc, char *argv[], char *envp[])

有人可以加深我对这些主题的理解吗?或者可以给我提供一些可以阅读这些主题的资料吗?

答案1

a) 您似乎已经理解了这一点
b) 我想补充一点,双击资源管理器中的文件(大多数 Windows 用户都会这样做)与在命令提示符中键入文件名非常相似。这样,即使不熟悉文件的用户不知道处理文件所需的程序,他们也可以处理文件,如果他们不知道如何使用,他们也不必选择使用哪个程序。c
) 这里没问题
d) 我认为他们在这里得到的是execve允许脚本运行,而调用者不需要知道如何运行它。例如,程序可以运行 Python 程序,而无需知道它需要 Python 解释器。(答案结束)

不同之处在于:它从文件头而不是“默认应用程序”表获取如何执行文件的信息并匹配文件扩展名。这对文件创建者来说还有一个好处,即由他们来决定文件如何运行,而不是操作系统。此外,扩展名在这种情况下并不重要。

相关内容