【问题标题】:Precisely what owns the 'current working directory'?究竟是什么拥有“当前工作目录”?
【发布时间】:2012-02-23 08:45:08
【问题描述】:

我知道工作目录 (wd) 是什么以及它的用途(至少用于编写软件)。

我不明白的是 wd 的所有权。此外,我想了解不同操作系统之间的答案可能会有所不同,因此对于特定操作系统上的异常行为的任何澄清将不胜感激。

首先,wd 在哪里表现出来?它是否在一个进程内,并且该进程创建的所有线程共享相同的 wd?如果 wd 被线程“A”修改,那么线程“B”是否可以立即看到更改,而线程“B”也是由线程“A”的进程产生的?

其次,wd 最初是如何定义的?如果你从命令提示符开始,相当很容易看出,但是如果一个进程产生多个进程呢?


注意:Process Explorer 在其属性窗口中显示每个进程的 wd。

【问题讨论】:

    标签: language-agnostic process operating-system working-directory platform-agnostic


    【解决方案1】:
    1. 通常,当前工作目录是按进程构建的,因此进程中的所有线程共享一个 PWD,chdir 会立即传播到其他线程。 (在 Linux 上,可以使用低级 clone 系统调用创建具有自己 PWD 的线程。)

    2. PWD 继承自进程的父进程。有多少兄弟进程无关紧要;他们都会分享他们最初的 PWD。​​p>

    【讨论】:

    • 谢谢。为了澄清 2,是在创建子进程时获取父 PWD 的副本还是子进程“指向”父 PWD?
    • 重要的是要注意,父进程可以(在大多数现代操作系统上)在分叉时为子进程指定一个替代工作目录。
    • @Styne666 - 孩子的工作目录字段独立于父母。父工作目录的更改不应改变子进程。在 Windows 上,CreateProcess 在进程的内存中添加了一个RTL_USER_PROCESS_PARAMETERS 结构,其中包含UNICODE_STRING CurrentDirectoryPathHANDLE CurrentDirectoryHandle
    • @Polynomial 谢谢 :) 现在将所有这些作为一个答案发布,以便我给予您适当的信任。
    【解决方案2】:

    在大多数现代操作系统上,工作目录是进程的属性。当父进程派生出子进程时,它将(默认情况下)具有相同的工作目录。通常可以通过显式指定工作目录来覆盖此行为。

    一旦分叉,子级的工作目录字段就独立于父级。父工作目录的更改不应改变子进程。复制与工作目录相关的任何句柄或安全令牌的行为高度依赖于操作系统。

    在 Windows 上,CreateProcessRTL_USER_PROCESS_PARAMETERS 结构添加到进程的内存中,其中包含UNICODE_STRING CurrentDirectoryPathHANDLE CurrentDirectoryHandle。在现有 NT 版本的 Windows 上,该结构始终在 0x20000 加载,但将来可能会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多