“当前工作目录”究竟归谁所有?

5

我知道工作目录(wd)的含义,尤其是在编写软件方面的用途。

然而,我不明白的是wd的所有权。此外,我想了解答案在不同操作系统之间可能会有所不同,因此如果能对特定操作系统上的异常行为进行说明将不胜感激。

首先,wd在哪里表现出来?它是否在进程内,由该进程创建的所有线程共享同一个wd?如果线程'A'修改了wd,线程'B'也由线程'A'的进程创建,那么是否立即可见?

其次,wd最初如何定义?如果从命令提示符启动某些内容,很容易看到它是如何定义的,但如果是生成多个进程的进程呢?


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

2个回答

4
在大多数现代操作系统中,工作目录是进程的属性。当父进程fork一个子进程时,默认情况下子进程将具有相同的工作目录。可以通过明确指定工作目录来覆盖这种行为。
一旦fork出子进程,子进程的工作目录字段就独立于其父进程。父进程的工作目录变更不应该影响子进程。复制任何与工作目录相关的句柄或安全令牌的行为高度依赖于操作系统。
在Windows上,CreateProcessRTL_USER_PROCESS_PARAMETERS结构添加到进程的内存中,其中包含UNICODE_STRING CurrentDirectoryPathHANDLE CurrentDirectoryHandle。该结构始终加载在现有的NT版本的Windows上的0x20000,但这可能会在未来发生改变。

3
  1. 一般来说,当前工作目录是每个进程的私有构造,所以所有线程共享一个单独的PWD,并且使用chdir命令立即传播到其他线程。 (在Linux上,可以使用底层clone系统调用创建具有自己PWD的线程。)

  2. PWD从进程的父进程继承。无论有多少兄弟进程,它们都将共享其初始PWD。


谢谢。为了澄清第二个问题,是在创建子进程时复制父进程的PWD还是子进程“指向”父进程的PWD? - Samuel Harmer
2
需要注意的是,在大多数现代操作系统中,父进程可以在分叉子进程时指定一个替代工作目录。 - Polynomial
1
@Styne666 - 子进程的工作目录字段是独立于父进程的。更改父进程的工作目录不应该影响子进程。在Windows上,CreateProcess会向进程的内存中添加一个RTL_USER_PROCESS_PARAMETERS结构,其中包含UNICODE_STRING CurrentDirectoryPathHANDLE CurrentDirectoryHandle - Polynomial
来源:http://undocumented.ntinternals.net/UserMode/Structures/RTL_USER_PROCESS_PARAMETERS.html - Polynomial
@Polynomial 谢谢 :) 现在把所有内容都发布为一个单独的答案,这样我就可以给你适当的荣誉了。 - Samuel Harmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接