如何从进程中获取信息,即UI(用户界面)进程或非ui?
使用UI流程我的意思是,Finder,Dock,系统UI服务器或任何其他具有UI界面的mac应用程序,它由Window Server使用。
我想从ProcessID确定此信息。
我正在使用mac os x。
答案 0 :(得分:2)
无法确定纯粹基于PID 数字的具体流程。原因是:在启动时从PID = 1顺序(有些)分配进程ID,并且不同系统的启动可能不同。例如,如果Finder或Dock崩溃并且必须重新启动,则还将重新分配进程ID。
如果您可以运行具有特定pid
的终端命令,请执行以下操作:
ps -p <pid> -o ucomm=
您将获得进程的文件名,您可以根据您知道的UI进程列表进行检查。例如,以下是我系统上用于当前登录会话的某些ps
命令的输出:
> ps -p 110 -o ucomm=
Dock
> ps -p 112 -o ucomm=
Finder
以下命令将按进程ID的顺序为您提供进程列表,只有名称:
> ps -ax -o pid=,ucomm=
1 launchd
10 kextd
11 DirectoryService
...
编辑:你可以做你所要求的,虽然它很复杂。 This回答提到:
来自CGWindow.h的函数CGWindowListCopyWindowInfo()将返回一个字典数组,每个窗口对应一个与您设置的条件相匹配的字典,包括其他应用程序中的条件。它只允许您通过给定窗口上方的窗口,给定窗口下方的窗口和“屏幕”窗口进行过滤,但返回的字典包含拥有应用程序的进程ID,您可以使用该进程ID将窗口与应用程序匹配。
如果您可以获取所有CGWindow
及其各自的pid
,那么您将了解所有UI应用程序的pid
,而无需在ps
处运行CFArrayRef UiProcesses()
{
CFArrayRef orderedwindows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID);
CFIndex count = CFArrayGetCount (orderedwindows);
CFMutableArrayRef uiProcess = CFArrayCreateMutable (kCFAllocatorDefault , count, &kCFTypeArrayCallBacks);
for (CFIndex i = 0; i < count; i++)
{
if (orderedwindows)
{
CFDictionaryRef windowsdescription = (CFDictionaryRef)CFArrayGetValueAtIndex(orderedwindows, i);
CFNumberRef windowownerpid = (CFNumberRef)CFDictionaryGetValue (windowsdescription, CFSTR("kCGWindowOwnerPID"));
CFArrayAppendValue (uiProcess, windowownerpid);
}
}
return uiProcess;
}
所有
Rahul已经为这种方法实现了以下代码,他要求我添加我的答案:
{{1}}
答案 1 :(得分:0)
请尝试以下操作。
#include <unistd.h>
if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO))
// Process associated with a terminal
else
// No terminal - probably UI process
答案 2 :(得分:0)
在darvidsOn的行中,下面是你问题的答案。
CFArrayRef UiProcesses()
{
CFArrayRef orderedwindows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID);
CFIndex count = CFArrayGetCount (orderedwindows);
CFMutableArrayRef uiProcess = CFArrayCreateMutable (kCFAllocatorDefault , count, &kCFTypeArrayCallBacks);
for (CFIndex i = 0; i < count; i++)
{
if (orderedwindows)
{
CFDictionaryRef windowsdescription = (CFDictionaryRef)CFArrayGetValueAtIndex(orderedwindows, i);
CFNumberRef windowownerpid = (CFNumberRef)CFDictionaryGetValue (windowsdescription, CFSTR("kCGWindowOwnerPID"));
CFArrayAppendValue (uiProcess, windowownerpid);
}
}
return uiProcess;
}
只需将您拥有的processid与数组项进行比较即可获得所需的结果。