当我从 Windows 资源管理器中的地址栏打开 cmd/powershel/任何其他应用程序时,它会自动在当前打开的目录中打开。问题是:应用程序如何知道这个路径?我以为它会作为参数传递给应用程序,但后来我编写了一个简单的程序,它只输出所有参数,看不到任何路径。所以,这不是基于参数的。那怎么办呢?
答案1
所有进程都有一个特殊的句柄来处理它们的“当前目录“又称“工作目录”,他们可以使用设置当前目录()或 POSIX chdir()。工作目录作为与参数或环境一起存在的单独属性;它会自动从父进程继承,但也可以在创建进程()称呼。
Windows 资源管理器指定lpCurrentDirectory
何时从其地址栏启动您尝试启动的程序。另一方面,当您cd
在 CMD.exe 中使用时,它也会使用 SetCurrentDirectory() 来切换其自己的工作目录,并且从中启动的程序会直接继承父 CMD.exe 进程的工作目录。(Explorer 在 Win98 中也执行相同的操作。)
您打开的程序可以明确调用 GetCurrentDirectory() 或 POSIX getcwd() 来确定位置,也可以通过相对路径隐式访问它,例如.
。
(Windows 也有额外的技巧来保持每个驱动器当前目录,以便与 MS-DOS 兼容,但这是通过常规环境变量实现的。这在 CreateProcess() 中也。