프로세스에서 UI (사용자 인터페이스) 프로세스 또는 비 UI 정보를 어떻게 얻을 수 있습니까?사용자 인터페이스 프로세스의 프로세스를 식별하는 방법은 무엇입니까?
UI 프로세스 란 Finder, Dock, 시스템 UI 서버 또는 UI 인터페이스가있는 다른 Mac 응용 프로그램을 의미하며 Window Server에서 사용됩니다.
이 정보는 ProcessID에서 확인하고 싶습니다.
Mac OS X을 사용하고 있습니다.
프로세스에서 UI (사용자 인터페이스) 프로세스 또는 비 UI 정보를 어떻게 얻을 수 있습니까?사용자 인터페이스 프로세스의 프로세스를 식별하는 방법은 무엇입니까?
UI 프로세스 란 Finder, Dock, 시스템 UI 서버 또는 UI 인터페이스가있는 다른 Mac 응용 프로그램을 의미하며 Window Server에서 사용됩니다.
이 정보는 ProcessID에서 확인하고 싶습니다.
Mac OS X을 사용하고 있습니다.
순전히 특정 프로세스가 무엇인지 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
의를 알 수 있습니다.
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;
}
두 번째 접근법에서는 창이 닫힌 경우입니다. VMWare Fussion은 해당 항목이 나열되지 않으므로 목록에 포함되지 않습니다. – MacGeek
글쎄, 유감스럽게도 이것이 내가 생각하는 해결책을 얻는 가장 가까운 곳이다. 모든 UI 프로세스의'pid '를 알아야 할 정확히 무엇을하고 있습니까? 시스템의 모든 UI 프로세스에 SIGKILL 또는 SIGTERM을 보내는 것은 나쁜 생각 일 수 있지만'pid'를 알아야 할 필요가있는 것은 무엇입니까? OS X 용 창 관리자를 작성하려고합니까? – darvids0n
예. osx 용 창 관리자를 쓰고 있습니다. – MacGeek
다음을 시도해보십시오.
#include <unistd.h>
if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO))
// Process associated with a terminal
else
// No terminal - probably UI process
이, 아래 질문에 대한 대답입니다 :
라훌 그는 내가 내 대답에 추가 요청이 방법에 대한 다음과 같은 코드를 구현했습니다.
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를 비교하십시오.
질문이 업데이트되었습니다.고마워 – MacGeek
당신의 'process'태그를 프로그래밍 언어로 대체하는 것을 권하고 싶습니다. 당신의 맥 중심 질문을 감안할 때, Objective-C가 적절하다고 생각됩니다. 많은 고급 사용자는 자신의 전문 분야에 대한 질문 만 검색합니다. 행운을 빕니다. – shellter
아마도 이것을 얻기위한 목적이 있습니다. 실제로 무엇을 성취하고자하는지 설명했다면 (왜 이것을 알아야 할 필요가 있고 왜 프로세스 ID가 필요한지), 더 유용한 대답을 얻을 수 있습니다. :) –