程序的工作目录如何/在哪里存储?

Posted

技术标签:

【中文标题】程序的工作目录如何/在哪里存储?【英文标题】:How/where is the working directory of a program stored? 【发布时间】:2011-04-16 10:32:51 【问题描述】:

当程序访问文件、使用system() 等时,该程序的当前工作目录在物理上是如何知道/存储在哪里的?由于逻辑上程序的工作目录类似于全局变量,因此理想情况下它应该是线程局部的,尤其是在像 D 这样的语言中,“全局”变量默认是线程局部的。是否可以将程序线程的当前工作目录设为本地?

注意:如果您不特别熟悉 D,即使是与语言无关的答案也会很有用。

【问题讨论】:

【参考方案1】:

当前目录由操作系统维护,而不是由语言或框架维护。详情请见description of GetCurrentDirectory WinAPI function。

来自描述:

多线程应用程序和共享 库代码不应使用 GetCurrentDirectory 函数和 应避免使用相对路径 名字。当前目录状态 由 SetCurrentDirectory 编写 函数存储为全局 每个过程中的变量,因此 多线程应用程序不能 可靠地使用这个值而不 其他可能的数据损坏 也可能正在阅读的线程或 设置这个值。

【讨论】:

+1:操作系统甚至不需要拥有当前目录。甚至根本没有目录。 “文件系统”可能是一个键/值数据库,它允许您将冒号、斜杠和反斜杠放在键中,只是为了好玩,但实际上并不关心。【参考方案2】:

在 Linux 上,每个进程都由一个进程描述符 - task_struct 表示。这个结构在内核源代码的include/linux/sched.h 中定义。

task_struct 的字段之一是指向fs_struct 的指针,它存储文件系统相关信息。 fs_struct 在include/linux/fs_struct.h 中定义。

fs_struct 有一个名为pwd 的字段,它存储有关当前工作目录的信息(它所在的文件系统,以及目录本身的详细信息)。

【讨论】:

以上是关于程序的工作目录如何/在哪里存储?的主要内容,如果未能解决你的问题,请参考以下文章

VSCode -- 如何设置调试工作目录

QSettings():如何保存到当前工作目录

我的Man脚本应该放在哪里才能工作?

苹果笔记本怎样把下载的东西放到指定目录?

Python 模块是如何工作的

如何编写ros的python程序