在使用launchd间接生成的情况下获取“真正的”父进程

时间:2017-06-25 08:43:16

标签: c macos launchd xpc

我正在维护一个OSX工具,它显示从直接父级到其最早祖先(通常是启动式)的所选进程的父树。

但是,如果已检查的进程使用事件(如双击捆绑包图标)或使用命令VectorDrawable从bash运行进程 - 从launchd间接生成,则此进程链可能会中断。在这些情况下,我希望相应地看到android:scaleTypeopen

也许XPC消息传递层是答案,因为我假设这些事件通过这种机制传递给launchd。但是,其他可用的OSX框架总是受欢迎的。

编辑:

我理解如果一个进程在运行时自行分离我无法恢复它的ppid,但我的目标是跟踪启动进程创建的调用者。

谢谢

2 个答案:

答案 0 :(得分:1)

此功能未记录。可能会在任何操作系统更新时中断。

$('#btnAfter').click(function(){
  $('.collection-nav').after('<span class="button">This is a button.</span>');
})

a)此方法是私有的

b)它需要root权限

例如:如果您启动Safari.app,还将创建一个名为“ Safari Networking”的新进程。 如果您在“活动监视器”中进行检查,则只会看到1的点数。

上面的代码片段将返回Safari进程的pid。如看时所见 “所有进程,分层”,其中“ Safari网络”分组在“ Safari”下。

答案 1 :(得分:0)

您所看到的是正确的行为。

当用户从Finder打开应用程序包时,或者在终端中使用open命令时,Launch Services负责执行应用程序。

当应用程序引入OS X / macOS时,它会根据捆绑包标识符向Launch Services注册,如捆绑包的Info.plist文件中所声明的那样。

当用户双击或使用终端中的open时,启动服务会收到捆绑包标识符并启动先前已注册的应用程序。

应该注意,如果应用程序包的标识符不唯一,则可能会出现问题。有两个具有相同版本和应用程序标识符的应用程序包,启动服务将执行它注册的第一个应用程序,但它可能不是用户认为它们正在运行的应用程序!

相反,如果您使用终端直接在应用程序包中执行二进制文件而不使用open,则其父级将是终端使用的shell应用程序。例如: -

/Applications/Calculator.app/Contents/MacOS/Calculator