2011-09-25 2 views
2

프로세스에서 UI (사용자 인터페이스) 프로세스 또는 비 UI 정보를 어떻게 얻을 수 있습니까?사용자 인터페이스 프로세스의 프로세스를 식별하는 방법은 무엇입니까?

UI 프로세스 란 Finder, Dock, 시스템 UI 서버 또는 UI 인터페이스가있는 다른 Mac 응용 프로그램을 의미하며 Window Server에서 사용됩니다.

이 정보는 ProcessID에서 확인하고 싶습니다.

Mac OS X을 사용하고 있습니다.

+1

질문이 업데이트되었습니다.고마워 – MacGeek

+1

당신의 'process'태그를 프로그래밍 언어로 대체하는 것을 권하고 싶습니다. 당신의 맥 중심 질문을 감안할 때, Objective-C가 적절하다고 생각됩니다. 많은 고급 사용자는 자신의 전문 분야에 대한 질문 만 검색합니다. 행운을 빕니다. – shellter

+0

아마도 이것을 얻기위한 목적이 있습니다. 실제로 무엇을 성취하고자하는지 설명했다면 (왜 이것을 알아야 할 필요가 있고 왜 프로세스 ID가 필요한지), 더 유용한 대답을 얻을 수 있습니다. :) –

답변

2

순전히 특정 프로세스가 무엇인지 PID 에 따라 확인할 방법이 없습니다. 그 이유는 프로세스 ID가 시작시 PID = 1에서 순차적으로 할당되고 다른 시스템에서 시작이 다를 수 있기 때문입니다. 예를 들어 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를 포함합니다. 당신은 모든 CGWindow들과 각각의 pid의를 얻을 수있는 경우

, 당신은 모든 ps을 실행할 필요없이 모든 UI 애플리케이션의 pid의를 알 수 있습니다.

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

두 번째 접근법에서는 창이 닫힌 경우입니다. VMWare Fussion은 해당 항목이 나열되지 않으므로 목록에 포함되지 않습니다. – MacGeek

+0

글쎄, 유감스럽게도 이것이 내가 생각하는 해결책을 얻는 가장 가까운 곳이다. 모든 UI 프로세스의'pid '를 알아야 할 정확히 무엇을하고 있습니까? 시스템의 모든 UI 프로세스에 SIGKILL 또는 SIGTERM을 보내는 것은 나쁜 생각 일 수 있지만'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

이, 아래 질문에 대한 대답입니다 :

라훌 그는 내가 내 대답에 추가 요청이 방법에 대한 다음과 같은 코드를 구현했습니다.

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 : darvids에게 평판 보상을 해달라고 요청합니다 .On. – MacGeek

+0

두 번째 접근 방식에서는 창이 닫힌 경우입니다. VMWare Fussion은 해당 항목이 나열되지 않으므로 목록에 포함되지 않습니다. – MacGeek

관련 문제