programing

실행 중인 프로세스 이름 검색

megabox 2023. 9. 26. 22:13
반응형

실행 중인 프로세스 이름 검색

우선, 비슷한 질문이 있다는 것을 알고 있지만, 지금까지 제공된 답변은 큰 도움이 되지 않았습니다(모두 다음 옵션 중 하나를 권장합니다).

특정 프로세스가 실행 중인지 확인해야 하는 사용자 애플리케이션이 있습니다.프로세스에 대해 알고 있는 내용은 다음과 같습니다.

  • 이름을
  • ()root)
  • 이미 실행 중이어야 합니다. 런치데몬(LaunchDaemon)은 다음을 의미합니다.
  • 는 이어야 .launchd(pid 1)

이것을 얻기 위해 몇 가지 방법을 시도해 보았지만, 지금까지 아무 것도 효과가 없었습니다.제가 시도한 것은 다음과 같습니다.

  1. 중인 입니다.ps출력을 파싱할 수 있습니다.효과는 있지만 속도는 느립니다.fork/exec비싸요), 그리고 가능한 한 빨리 했으면 좋겠습니다.

  2. 으로.GetBSDProcessList여기에 나열된 함수입니다.프로세스 이름을 가져오라고 하는 방식(액세스)으로도 작동합니다.kp_proc.p_comm각각으로 부터kinfo_proc구조)에 결함이 있습니다.gchar*음 16할 수 . 이는 정의에서 볼 수 있습니다.kp_proc구조:

    #mAXCOLEN 16 //파라미터에 정의된 MAXCOLMEN 16 //정의.hstruct external_proc {/proc.h에서 정의됨...snip...
    chap_comm[MAXCOLEN+1];...snip...};
  3. libProc.h를 사용하여 프로세스 정보 검색:

    pid_t pids[1024];
    int NumberOfProcesses = proc_listpids (PROC_ALL_PIDS, 0, NULL, 0);proc_listpids(PROC_ALL_PIDS, 0, pids, (pids)의 크기);(inti = 0; i < 프로세스 수; ++i) {(pids[i] == 0) {계속; }문자 이름[1024];proc_name(pids[i], 이름, 크기(이름));printf("찾은 프로세스: %s\n", 이름);
    }

    다음과 같은 결함이 있는 경우를 제외하고는 작동합니다.GetBSDProcessList 프로세스 이름의 첫 번째 부분만 반환됩니다.

  4. 카본에서 프로세스 관리자 기능 사용:

    프로세스 일련 번호 psn;psn.lowLongOfPSN = kNo Process;psn.하이롱오브PSN = 0;(GetNextProcess(&psn) == noErr) { 동안CFStringRefprocName = NULL;if (CopyProcessName(&psn, &procName) == noErr) {NSLog(@"찾은 프로세스: %@", (NS 문자열 *)procName);}CF 릴리즈(procName);
    }

    이거 안 돼요.윈도우 서버(또는 그와 비슷한 것)에 등록된 프로세스만 반환합니다.즉, UI가 있는 앱만 반환하고, 현재 사용자에 대해서만 반환합니다.

  5. 10.5 호환이 되어야 하므로 사용할 수 없습니다.또한 현재 사용자에 대해 Dock에 나타나는 응용프로그램에 대한 정보만 반환합니다.

실행 중인 프로세스의 이름을 검색할 수 있다는 것을 알고 있습니다.ps 수 다를 할 수 이다), 냐"다를는합니다.ps?".

좋은 의견이라도 있나?

편집

훨씬 더 많은 연구를 해보았지만, 저는 이것을 할 방법을 찾지 못했습니다.파이썬 모듈에서 C 파일을 언급한 SO 질문을 찾았습니다.이것은 사용을 시도하는데 정말 유용했습니다.KERN_PROCARGSsysctl러.

에서 로 된 것으로 ps, 여기서 찾은 거죠ps실행 중인 모든 프로세스의 실행 가능한 경로를 얻을 수 있습니다. 하지만 이 작업을 수행하는 방법을 추출하기 위한 최선의 노력은 성공적이지 않았습니다.기능이 있습니다.print.c을 받은getproclline마법을 수행하는 것처럼 보이지만, 자신의 명령줄 도구 내에서 동일한 코드를 실행하면 자신의 프로세스 이외에 실행 가능한 프로세스를 검색할 수 없습니다.

계속 실험을 해보겠지만, 더 결정적인 증거가 없는 상황에서 @drawonward의 답변이 지금까지 가장 정확한 것 같습니다.


EDIT(오랜 시간 후)

퀸 테일러가 지적한 답변 덕분에 효과가 있는 것을 찾았습니다.각 프로세스의 실행 가능한 경로를 가져온 다음 마지막 경로 구성요소를 잡고 실제 프로세스 이름을 가져올 수 있습니다.

#import <sys/proc_info.h>
#import <libproc.h>

int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);
pid_t pids[numberOfProcesses];
bzero(pids, sizeof(pids));
proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));
for (int i = 0; i < numberOfProcesses; ++i) {
    if (pids[i] == 0) { continue; }
    char pathBuffer[PROC_PIDPATHINFO_MAXSIZE];
    bzero(pathBuffer, PROC_PIDPATHINFO_MAXSIZE);
    proc_pidpath(pids[i], pathBuffer, sizeof(pathBuffer));
    if (strlen(pathBuffer) > 0) {
        printf("path: %s\n", pathBuffer);
    }
}

관련된 질문에 대한 이 답변은 어떻습니까?https://stackoverflow.com/a/12274588/120292 이것은 pid에 의해 프로세스의 전체 경로를 얻는 것을 목적으로 하며, 마지막 경로 구성요소만 잡을 수 있습니다.

실행 중인 프로세스의 유일한 전체 목록은 위의 2에서 커널에 요청하여 제공됩니다.공정의 실제 이름을 얻는 것은 간단하지 않습니다.간단히 말해서, 당신은 당신이 일치할 때까지 당신이 찾을 수 있는 다른 모든 소스에서 pid를 찾아봅니다.

일부 프로세스의 경우 다음이 작동합니다.

ProcessSerialNumber         psn;
CFStringRef             name = NULL;
status = GetProcessForPID( inPID , &psn );
if ( noErr == status ) CopyProcessName( &psn , &name );

할 수 , pid 를를 에서합니다.[[NSWorkspace sharedWorkspace] launchedApplications]타고NSApplicationProcessIdentifier 가능 10.2 이상에서 사용 가능.이 목록의 대부분의 항목은 위의 CopyProcessName과 동일합니다.

일부 프로세스의 경우 프로세스 인수를 찾아보고 첫 번째 인수에서 전체 경로를 얻을 수 있습니다.원래 목록을 가져오는 것과 유사하지만 두 번째 mib 값으로 KERN_PROCARGS 또는 KERN_PROCARGS2를 사용합니다.이게 뭐예요.ps하고 있습니다.

일부 프로세스의 경우 16자 p_comm으로 고정됩니다.

이것이 당신이 찾고 있는 것인지는 확실하지 않지만, 당신이 사용할 수 있는LaunchServices__이 있는 APILSCopyApplicationArrayInFrontToBackOrder? 들어본 적은 있지만 직접 사용해본 적은 없습니다.구글 검색을 좀 한 후에, 여기 당신이 찾고 있는 것을 제공할 수 있는 코드 샘플이 있습니다.저는 정말 잘 모르고 조금 추측하고 있습니다 ;)

http://gist.github.com/163918

편집

사실 하.이것을 답으로 주는 스택 오버플로 게시물과 내가 링크한 것과 같은 게시물로 링크...

http://www.stackoverflow.com/questions/945033/getting-the-list-of-running-applications-ordered-by-last-use

언급URL : https://stackoverflow.com/questions/3018054/retrieve-names-of-running-processes

반응형