unix 如何识别用户界面进程中的进程?

bzzcjhmw  于 2023-03-02  发布在  Unix
关注(0)|答案(4)|浏览(184)

如何从一个进程中获取信息,确定它是UI(用户界面)进程还是非UI进程?
与UI进程我的意思是,查找器,码头,系统UI服务器,或任何其他Mac应用程序有UI界面,它是由Windows服务器使用。
我想从ProcessID中确定此信息。
我用的是mac os x。

zzlelutf

zzlelutf1#

没有办法纯粹根据PID编号来确定特定进程是什么。原因如下:进程ID在启动时从PID=1开始按顺序分配,不同系统的启动方式可能不同。如果Finder或Dock崩溃并且必须重新启动,进程ID也将被重新分配。
但是,如果您可以使用特定的pid运行terminal命令,请执行以下操作:

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
     ...
  • 编辑:* 你也许能做到你要求的,虽然它是错综复杂的。这个答案提到:

CGWindow. h中的函数CGWindowListCopyWindowInfo()将返回一个字典数组,每个字典对应一个与您设置的条件匹配的窗口,包括其他应用程序中的窗口。它只允许您按给定窗口上方的窗口、给定窗口下方的窗口和“屏幕上”窗口进行过滤,但返回的字典包含所属应用程序的进程ID,您可以使用该进程ID来匹配窗口与应用程序。
如果您可以获得所有CGWindow及其各自的pid,那么您将知道所有UI应用程序的pid,而根本不需要运行ps
Rahul已经为这种方法实现了下面的代码,他要求我在回答时添加这些代码:

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;
}
w1jd8yoj

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
krcsximq

krcsximq3#

在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与数组项进行比较,即可获得所需的结果。

kokeuurv

kokeuurv4#

有点像复活这个...但是对于macOS来说,要获得UI的各个元素的进程ID,你可以使用lsapinfo,因为也许Tiger?手册页上写着2013年4月,但我认为它是在这个问题被问到的时候左右,可能更早。命令应该以当前拥有loginwindow进程的用户身份运行。

lsappinfo info -only pid Dock
"pid"=545

相关问题