查找启动 NSRunningApplication 的用户

问题描述 投票:0回答:3

我如何检索此信息?给定一个

NSRunningApplication
实例,我需要知道是谁启动了它。活动监视器显示此信息。

objective-c nsrunningapplication
3个回答
2
投票

如果您只需要启动

NSRunningApplication
实例的用户的名称,这里有一个类别方法可以做到这一点:

#import <libproc.h>
#import <pwd.h>

@implementation NSRunningApplication (UserName)

- (NSString *)foo_userName {
    pid_t pid = [self processIdentifier];
    struct proc_bsdshortinfo info;
    proc_pidinfo(pid, PROC_PIDT_SHORTBSDINFO, 0, &info, sizeof(info));
    struct passwd *passwd = getpwuid(info.pbsi_uid);
    return [NSString stringWithUTF8String:passwd->pw_name];
}

@end

2
投票

来自 NSRunningApplication 的文档:Only user applications are tracked;这不提供有关系统上每个进程的信息。

即它不会为您提供系统上的所有进程。

你能做的最接近的事情是从

runningApplications
抓住
NSWorkspace
。但这将是一个不完整的列表。

或者,您可以深入了解系统在活动监视器中使用的相同 API。但这会很痛苦。或者你可以从 NSTask 启动

ps auxwww
并解析输出,同样痛苦。


0
投票

NSRunningApplication 类只会为您提供由当前用户运行的应用程序实例。如果多个用户同时登录到 Mac,每个用户都运行自己的应用程序,NSRunningApplication 将不会为所有登录用户提供正在运行的应用程序列表。只有呼叫用户的应用程序。

就是说,OP 的问题转化为“我的用户名是什么”,因为任何 NSRunningApplication 实例都将由该用户拥有和运行,

一个重要的旁注 - NSRunningApplication 只返回捆绑应用程序的主要进程。它不会提供子进程(XPC 服务、登录项、守护进程代理、命令行工具等)。如今,许多应用程序将大部分工作委托给这些子流程之一,并且不会被捕获。

© www.soinside.com 2019 - 2024. All rights reserved.