ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

WezTerm Lua API 实战:用 `wezterm.procinfo.current_working_dir_for_pid()` 查询任意进程的工作目录

WezTerm Lua API 实战:用 `wezterm.procinfo.current_working_dir_for_pid()` 查询任意进程的工作目录 WezTerm Lua API 实战用wezterm.procinfo.current_working_dir_for_pid()查询任意进程的工作目录【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/weztermwezterm.procinfo.current_working_dir_for_pid(pid)是 WezTerm 内置于 Lua 配置环境的wezterm.procinfo模块中的函数用于根据进程 IDPID查询该进程当前的工作目录current working directory简称 cwd。在编写 Lua 配置如根据前台进程所在目录动态改变标题、决定启动行为时这一函数是获取“进程当前处于哪个目录”的关键入口。读完本文你将掌握该函数的签名、返回值语义、各平台底层实现原理以及结合wezterm.procinfo.pid()等配套函数的完整实战用法。函数签名与返回值wezterm.procinfo.current_working_dir_for_pid(pid)自 WezTerm 版本20220807-113146-c2fee766起可用该版本号同时适用于整个wezterm.procinfo模块见 模块索引。参数pid一个无符号整数u32即目标进程的进程 ID。返回值目标进程当前工作目录的字符串形式例如/home/wez/wez-personal/wezterm。失败语义如果函数无法获取该信息会返回 Lua 的nil而不是抛出异常或返回空字符串。原文档给出的交互式示例在wezterm cli的 Lua REPL 风格环境中执行 wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid()) /home/wez/wez-personal/wezterm这里wezterm.procinfo.pid()返回的是当前WezTerm 进程自身的PID因此current_working_dir_for_pid返回的就是 WezTerm 运行时所在的工作目录。Lua 绑定层是如何实现的该函数并非由 Lua 解释器内置而是由 WezTerm 在启动时向 Lua 环境中注册的。绑定代码位于 lua-api-crates/procinfo-funcs/src/lib.rsproc_mod.set( current_working_dir_for_pid, lua.create_function(|_, pid: u32| { Ok(LocalProcessInfo::current_working_dir(pid) .and_then(|p| p.to_str().map(|s| s.to_string()))) })?, )?;从这段源码可以确认三个事实pid参数在 Rust 侧以u32接收传入非法类型会在调用时直接报错。底层调用的是procinfocrate 中的LocalProcessInfo::current_working_dir(pid)其返回类型是OptionPathBuf见 procinfo/src/lib.rs。PathBuf只有在能被无损转换为 UTF-8 字符串时才会返回字符串如果路径包含非法 UTF-8 序列.to_str()返回None最终同样表现为nil。换句话说nil既可能来自“取不到 cwd”也可能来自“取到了但无法编码为合法字符串”。各平台底层实现原理procinfocrate 对三种主流平台分别提供了独立实现接口统一收敛到LocalProcessInfo::current_working_dirLinux读取/proc/pid/cwd符号链接在 procinfo/src/linux.rs 中实现极其简洁pub fn current_working_dir(pid: u32) - OptionPathBuf { std::fs::read_link(format!(/proc/{}/cwd, pid)).ok() }Linux 的 procfs 会为每个进程维护一个指向其 cwd 的符号链接/proc/pid/cwdread_link一次系统调用即可拿到路径。值得注意的是read_link在解析失败时例如进程不存在、权限不足、进程是内核线程或已退出会返回Err经.ok()转换后即为None——这也是该函数在 Linux 上返回nil的主要场景。macOSproc_pidinfoPROC_PIDVNODEPATHINFO在 procinfo/src/macos.rs 中实现调用 BSD 系统调用proc_pidinfo请求PROC_PIDVNODEPATHINFO从返回的proc_vnodepathinfo结构中取出pvi_cdir.vip_pathvnode 路径作为 cwd。代码中还对 libc crate 中vip_path被定义为嵌套数组的历史兼容问题做了重新切片处理并从第一个\0处截断得到 C 字符串。Windows读取目标进程 PEB 中的进程参数块Windows 没有 procfs实现最重位于 procinfo/src/windows.rs。其链路为OpenProcess以PROCESS_QUERY_INFORMATION | PROCESS_VM_READ权限打开目标进程windows.rs通过NtQueryInformationProcess拿到PROCESS_BASIC_INFORMATION中的PebBaseAddress再跨进程ReadProcessMemory读取 PEB 及其RTL_USER_PROCESS_PARAMETERSwindows.rs从CurrentDirectory.DosPath读出工作目录windows.rs。实现还专门处理了 32 位进程运行在 64 位 Windows 上的情况通过ProcessWow64Information判断 WoW64 进程并改用RTL_USER_PROCESS_PARAMETERS32结构windows.rs同时对读取的字符串长度设了上限MAX_PATH * 4以防御读到错误的内核结构偏移windows.rs。由于OpenProcess对高权限进程可能失败Windows 上对受保护进程查询会返回nil。其他平台procinfocrate 只在linux、macos、windows三个目标上实现了查询逻辑其余平台直接返回None见 procinfo/src/lib.rs也就是说在这些平台上调用本函数会得到nil。返回nil的典型场景综合平台实现以下情况current_working_dir_for_pid都会返回nil指定的 PID 不存在或进程已退出查询存在竞态窗口进程权限高于 WezTerm无法读取其信息Windows 上尤为常见Linux 上则表现为对/proc/pid/cwd的访问被拒绝目标进程不是普通用户态进程如 Linux 内核线程目标 cwd 无法编码为合法 UTF-8 字符串运行在不支持查询的平台如 FreeBSD、NetBSD 等。因此在 Lua 配置中调用时务必对nil做防御性判断例如local cwd wezterm.procinfo.current_working_dir_for_pid(pid) if cwd nil then -- 处理无法获取 cwd 的情况 return end与wezterm.procinfo模块其他函数的搭配current_working_dir_for_pid是wezterm.procinfo模块四个函数之一注册代码见 lua-api-crates/procinfo-funcs/src/lib.rs其余三个分别是wezterm.procinfo.pid()返回当前进程即 WezTerm 自身的 PID底层是libc::getpid()常与本函数组合使用如文档示例wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid())。wezterm.procinfo.get_info_for_pid(pid)返回一个LocalProcessInfo结构对象其中cwd字段即工作目录同时还包括pid、ppid、name、executable、argv、status、start_time、children递归子进程树等字段定义见 procinfo/src/lib.rs。若只需 cwd 而不想承担构建整棵进程树的开销应优先使用current_working_dir_for_pid。wezterm.procinfo.executable_path_for_pid(pid)返回进程可执行镜像的路径与本函数互为补充一个回答“进程在哪个目录”一个回答“进程可执行文件在哪”。实战示例在配置中查询并展示目录一个常见的用法是在 WezTerm 的 Lua 配置中结合事件回调根据进程工作目录定制行为。例如获取某个已知 PID 的目录并记录日志需搭配wezterm.log_info输出local wezterm require wezterm -- 查询 WezTerm 自身的工作目录 local self_cwd wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid()) if self_cwd ~ nil then wezterm.log_info(WezTerm is running in: .. self_cwd) else wezterm.log_info(Unable to determine the current working directory) end需要提醒的是该函数是同步查询系统进程信息的阻塞调用且查询整棵进程树get_info_for_pid在进程较多的系统上开销较大若在你的配置中高频调用应尽量缓存结果或限定目标 PID避免拖慢事件回调。同时所有路径查询都存在“进程在查询瞬间退出”的天然竞态代码中始终以nil作为兜底分支即可。小结wezterm.procinfo.current_working_dir_for_pid(pid)是 WezTerm Lua 配置中查询进程工作目录的唯一官方入口它由 procinfo-funcs 注册到 Lua 环境核心逻辑在 procinfo crate 中按平台分派——Linux 走/proc/pid/cwd符号链接macOS 走proc_pidinfo的 vnode path 接口Windows 则深入 PEB 读取进程参数块。使用时牢记两点即可nil代表“查不到”必须在配置中兜底处理若同时需要 argv、可执行文件路径或子进程树则改用同模块的 get_info_for_pid。【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表