2011-09-25 82 views
2

我怎样才能得到一个过程,它是UI(用户界面)工艺或非UI信息?如何确定是否在用户界面进程的进程?

随着UI过程中,我的意思是,搜索,码头,系统UI服务器,或具有UI界面,它由Window服务器的任何其他Mac应用程序。

我要确定从该的ProcessID信息。

我使用Mac OS X的。

+1

我已更新问题。谢谢 – MacGeek

+1

我建议用编程语言替换你的'process'标签,鉴于你的以mac为中心的问题,Objective-C似乎是合适的。许多电力用户只能扫描其专业问题。祝你好运。 – shellter

+0

大概有一个目的是得到这个。如果你解释了你实际想要达到的目标(为什么你需要知道这一点,以及为什么从过程ID?),你可能会得到更有用的答案。 :) –

回答

2

没有办法纯粹基于将PID 什么具体过程是确定。这样做的原因:进程ID分配(有点)在启动时从PID = 1顺序和启动可以是不同的系统不同。进程ID也将被如果,例如,搜索或Dock崩溃和必须重新启动重新分配。

如果你可以运行你有,但具体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 S和它们各自的pid S,那么你就会知道pid S的所有UI应用程序,而无需运行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; 
} 
+0

在第二种方法中,如果窗口靠近。可以说VMWare Fussion,它的条目不会被列出,因此它不会被列入清单。 – MacGeek

+0

好吧,不幸的是,这是最接近你的解决方案,我认为。你究竟在做什么,需要知道每个UI过程的'pid'?发送一个SIGKILL或SIGTERM到系统上的所有UI进程将是一个坏主意,但你还需要知道'pid'的作用?你是否想为OS X编写窗口管理器? – darvids0n

+0

是的。我正在编写osx的窗口管理器。 – MacGeek

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 
+0

上面的代码将工作,如果你在过程域。我相信问题是关于通过某个pid或类似的东西获取有关该过程的信息 – MacGeek

+1

是的!问题是关于通过pid获取有关进程的信息。 – MacGeek

+0

我认为这不适用于问题中提到的流程;例如,Finder可能没有stdin,stdout和stderr指向ttys。 OP在询问有关活动GUI的进程,对吧? –

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以获得所需的结果。

+0

@darvidsOn:对不起darvidsOn。我没有编辑权限来更新您的答案,从而张贴新的答案。 – MacGeek

+0

@machintosh:我要求你给予darvidsOn声誉奖励。 – MacGeek

+0

在第二种方法中,如果窗口靠近。可以说VMWare Fussion,它的条目不会被列出,因此它不会被列入清单。 – MacGeek

相关问题