You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Swift调用proc_pidinfo无法获取进程打开文件的问题排查

为什么Swift调用proc_pidinfo无法获取Preview.app的实际打开文件,且结果远少于lsof?
  • 权限与沙盒隔离限制
    Preview是严格沙盒化的macOS应用,macOS的沙盒机制会阻止非特权进程读取沙盒进程中指向用户私有文件的真实路径。当你以普通用户权限调用proc_pidinfo时,系统会隐藏这些敏感路径,只返回沙盒允许公开的资源(比如FontCollections、CoreImage相关的系统文件)。要获取真实的用户文件路径,你需要以root权限运行程序,或者给程序授予「完全磁盘访问」权限(系统设置>隐私与安全性>完全磁盘访问中添加)。即使是lsof,不以root权限运行的话,也只能看到沙盒容器内的虚拟路径,而非用户文件的真实路径。

  • proc_pidinfo接口的信息覆盖范围有限
    proc_pidinfo仅能返回内核对外暴露的基础文件描述符信息,而lsof是一个功能更全面的工具——它会结合多种内核接口(比如task_info、vm_region)、解析进程内存、读取系统临时目录等方式,收集所有类型的「打开对象」,包括socket、管道、内存映射文件、动态链接库等。这就是proc_pidinfo返回的条目数量远少于lsof的核心原因。

  • 沙盒路径虚拟化导致路径识别困难
    沙盒应用打开用户文件时,系统会将真实路径虚拟化为沙盒容器内的映射路径。比如你打开~/Documents/test.pdf,Preview内部访问的是沙盒容器中的对应路径,proc_pidinfo返回的就是这个虚拟路径,而非你预期的用户目录下的真实路径。如果没意识到这种虚拟化机制,就会误以为没有获取到目标文件。

  • 文件类型过滤导致统计不全
    你只筛选了PROX_FDTYPE_VNODE类型的条目,但lsof会统计所有类型的打开对象:unix域套接字、管道、网络socket、内存映射段等。这些对象在proc_pidinfo中也有返回,但如果你只统计vnode类型,自然数量会比lsof少很多。

内容的提问来源于stack exchange,提问作者Lupurus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:26:33