如何从一个进程中获取信息,确定它是UI(用户界面)进程还是非UI进程?与UI进程我的意思是,查找器,码头,系统UI服务器,或任何其他Mac应用程序有UI界面,它是由Windows服务器使用。我想从ProcessID中确定此信息。我用的是mac os x。
zzlelutf1#
没有办法纯粹根据PID编号来确定特定进程是什么。原因如下:进程ID在启动时从PID=1开始按顺序分配,不同系统的启动方式可能不同。如果Finder或Dock崩溃并且必须重新启动,进程ID也将被重新分配。但是,如果您可以使用特定的pid运行terminal命令,请执行以下操作:
pid
ps -p <pid> -o ucomm=
您将获得进程的文件名,您可以对照一系列您知道是UI进程的文件名进行检查。例如,下面是我当前登录会话中某些ps命令在我的系统上的输出:
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 ...
CGWindow. h中的函数CGWindowListCopyWindowInfo()将返回一个字典数组,每个字典对应一个与您设置的条件匹配的窗口,包括其他应用程序中的窗口。它只允许您按给定窗口上方的窗口、给定窗口下方的窗口和“屏幕上”窗口进行过滤,但返回的字典包含所属应用程序的进程ID,您可以使用该进程ID来匹配窗口与应用程序。如果您可以获得所有CGWindow及其各自的pid,那么您将知道所有UI应用程序的pid,而根本不需要运行ps。Rahul已经为这种方法实现了下面的代码,他要求我在回答时添加这些代码:
CGWindow
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; }
w1jd8yoj2#
尝试以下方法。
#include <unistd.h> if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO)) // Process associated with a terminal else // No terminal - probably UI process
krcsximq3#
在darvidsOn的线路上,下面是你问题的答案。
只需将您拥有的processid与数组项进行比较,即可获得所需的结果。
kokeuurv4#
有点像复活这个...但是对于macOS来说,要获得UI的各个元素的进程ID,你可以使用lsapinfo,因为也许Tiger?手册页上写着2013年4月,但我认为它是在这个问题被问到的时候左右,可能更早。命令应该以当前拥有loginwindow进程的用户身份运行。
lsappinfo info -only pid Dock "pid"=545
4条答案
按热度按时间zzlelutf1#
没有办法纯粹根据PID编号来确定特定进程是什么。原因如下:进程ID在启动时从PID=1开始按顺序分配,不同系统的启动方式可能不同。如果Finder或Dock崩溃并且必须重新启动,进程ID也将被重新分配。
但是,如果您可以使用特定的
pid
运行terminal命令,请执行以下操作:您将获得进程的文件名,您可以对照一系列您知道是UI进程的文件名进行检查。例如,下面是我当前登录会话中某些
ps
命令在我的系统上的输出:下面的命令将按照进程ID的顺序给予一个进程列表,其中只有名称:
CGWindow. h中的函数CGWindowListCopyWindowInfo()将返回一个字典数组,每个字典对应一个与您设置的条件匹配的窗口,包括其他应用程序中的窗口。它只允许您按给定窗口上方的窗口、给定窗口下方的窗口和“屏幕上”窗口进行过滤,但返回的字典包含所属应用程序的进程ID,您可以使用该进程ID来匹配窗口与应用程序。
如果您可以获得所有
CGWindow
及其各自的pid
,那么您将知道所有UI应用程序的pid
,而根本不需要运行ps
。Rahul已经为这种方法实现了下面的代码,他要求我在回答时添加这些代码:
w1jd8yoj2#
尝试以下方法。
krcsximq3#
在darvidsOn的线路上,下面是你问题的答案。
只需将您拥有的processid与数组项进行比较,即可获得所需的结果。
kokeuurv4#
有点像复活这个...但是对于macOS来说,要获得UI的各个元素的进程ID,你可以使用lsapinfo,因为也许Tiger?手册页上写着2013年4月,但我认为它是在这个问题被问到的时候左右,可能更早。命令应该以当前拥有loginwindow进程的用户身份运行。