실행 중인 프로세스 이름 검색
우선, 비슷한 질문이 있다는 것을 알고 있지만, 지금까지 제공된 답변은 큰 도움이 되지 않았습니다(모두 다음 옵션 중 하나를 권장합니다).
특정 프로세스가 실행 중인지 확인해야 하는 사용자 애플리케이션이 있습니다.프로세스에 대해 알고 있는 내용은 다음과 같습니다.
- 이름을
- ()
root
) - 이미 실행 중이어야 합니다. 런치데몬(LaunchDaemon)은 다음을 의미합니다.
- 는 이어야 .
launchd
(pid 1)
이것을 얻기 위해 몇 가지 방법을 시도해 보았지만, 지금까지 아무 것도 효과가 없었습니다.제가 시도한 것은 다음과 같습니다.
중인 입니다.
ps
출력을 파싱할 수 있습니다.효과는 있지만 속도는 느립니다.fork
/exec
비싸요), 그리고 가능한 한 빨리 했으면 좋겠습니다.으로.
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...};
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
프로세스 이름의 첫 번째 부분만 반환됩니다.카본에서 프로세스 관리자 기능 사용:
프로세스 일련 번호 psn;psn.lowLongOfPSN = kNo Process;psn.하이롱오브PSN = 0;(GetNextProcess(&psn) == noErr) { 동안CFStringRefprocName = NULL;if (CopyProcessName(&psn, &procName) == noErr) {NSLog(@"찾은 프로세스: %@", (NS 문자열 *)procName);}CF 릴리즈(procName); }
이거 안 돼요.윈도우 서버(또는 그와 비슷한 것)에 등록된 프로세스만 반환합니다.즉, UI가 있는 앱만 반환하고, 현재 사용자에 대해서만 반환합니다.
10.5 호환이 되어야 하므로 사용할 수 없습니다.또한 현재 사용자에 대해 Dock에 나타나는 응용프로그램에 대한 정보만 반환합니다.
실행 중인 프로세스의 이름을 검색할 수 있다는 것을 알고 있습니다.ps
수 다를 할 수 이다), 냐"다를는합니다.ps
?".
좋은 의견이라도 있나?
편집
훨씬 더 많은 연구를 해보았지만, 저는 이것을 할 방법을 찾지 못했습니다.파이썬 모듈에서 이 C 파일을 언급한 SO 질문을 찾았습니다.이것은 사용을 시도하는데 정말 유용했습니다.KERN_PROCARGS
sysctl
러.
에서 로 된 것으로 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
? 들어본 적은 있지만 직접 사용해본 적은 없습니다.구글 검색을 좀 한 후에, 여기 당신이 찾고 있는 것을 제공할 수 있는 코드 샘플이 있습니다.저는 정말 잘 모르고 조금 추측하고 있습니다 ;)
편집
사실 하.이것을 답으로 주는 스택 오버플로 게시물과 내가 링크한 것과 같은 게시물로 링크...
언급URL : https://stackoverflow.com/questions/3018054/retrieve-names-of-running-processes
'programing' 카테고리의 다른 글
안드로이드에서 테두리가 있는 테이블을 만들려면 어떻게 해야 합니까? (0) | 2023.09.26 |
---|---|
Angular2 자습서(Tour of Heroes)'angular2-in-memory-web-api' 모듈을 찾을 수 없습니다. (0) | 2023.09.26 |
WP-REST API에 대한 사용자 지정 경로 끝점에서 "코드"를 제공합니다. "rest_no_route", 오류 (0) | 2023.09.21 |
자바스크립트 REST 클라이언트 라이브러리 (0) | 2023.09.21 |
Understanding Fragment's setRetainInstance(boolean) (0) | 2023.09.21 |