実行中のすべてのプロセス名とPIDを取得する - MacOSのは、開発します

方法1:AppleScriptのでゲット

開発中のAppleScriptはまた、非常に使いやすいです。

tell application "System Events"
	set listOfProcesses to every process
	set allProcess to {}
	
	repeat with processItem in listOfProcesses
		set procname to name of processItem as string
		set processId to unix id of processItem as string
		set processDic to {ProcessName:procname, processId:processId}
		copy processDic to end of allProcess
	end repeat
	
	return allProcess
end tell

注意、あなたが実行中のプロセスのほとんどに取得することができ、あなたのプロジェクトで上記のスクリプトを実行し、大部分は、例えば、そのため、他の方法を模索し続けて、あまり得るためにADBの方法を使用します。

方法2:ps ax取得

psコマンドによって得ることができるが、この方法は、独自の解像度、低速度と効率を必要とし、これは適用されません。

方法3:でGetBSDProcessListGET

ことにより、GetBSDProcessList機能(私はポイントを得ることができます)すべてのプロセスに、しかし、アクセスkinfo_proc構造kp_proc.p_commときのみ16ビット長。これは次のように定義されています。

#define MAXCOMLEN 16 //defined in param.h
struct extern_proc {  //defined in proc.h
  ...snip...
  char p_comm[MAXCOMLEN+1];
  ...snip...
};

方法4:使用libProc.h GET

pid_t pids[1024];
int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);   
proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));    
for (int i = 0; i < numberOfProcesses; ++i) {
  if (pids[i] == 0) { continue; }
  char name[1024];
  proc_name(pids[i], name, sizeof(name));
  printf("Found process: %s\n", name);
}

情報が取得されているが、しかし、及びGetBSDProcessList不完全同じプロセス名表示の問題があります

方法5:使用ProcessManager機能は、プロセス情報を取得します

ProcessSerialNumber psn;
psn.lowLongOfPSN = kNoProcess;
psn.highLongOfPSN = 0;
while (GetNextProcess(&psn) == noErr) {
  CFStringRef procName = NULL;
  if (CopyProcessName(&psn, &procName) == noErr) {
    NSLog(@"Found process: %@", (NSString *)procName);
  }
  CFRelease(procName);
}

申し訳ありませんが、このアプローチは動作しません。それだけでWindowServer(または似たような)に登録プロセスを返します。言い換えれば、それだけでなく、現在のユーザーのみのため、UIを持つアプリケーションを返します。

方法6:使用-[NSWorkspace launchedApplications]

唯一のDockの現在のアプリケーションのユーザーが表示されますに関する情報を返します。

方法7:非常にシンプルで使いやすい、しかしかかわらずOSX10.15betaで使用される方法のものの

#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);
    }
}

この方法は非常に効果的であるが、OSX10.15betaシステム、取得numberOfProcessesに問題があります0

八:究極のソリューション、それを強くお勧めします!

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

- (NSArray *)runningProcesses {
    
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
    u_int miblen = 4;
    
    size_t size;
    int st = sysctl(mib, miblen, NULL, &size, NULL, 0);
    
    struct kinfo_proc * process = NULL;
    struct kinfo_proc * newprocess = NULL;
    
    do {
        size += size / 10;
        newprocess = realloc(process, size);
        
        if (!newprocess){
            
            if (process){
                free(process);
            }
            return nil;
        }
        process = newprocess;
        st = sysctl(mib, miblen, process, &size, NULL, 0);
        
    } while (st == -1 && errno == ENOMEM);
    
    if (st == 0){
        if (size % sizeof(struct kinfo_proc) == 0){
            int nprocess = (int)(size / sizeof(struct kinfo_proc));
            
            if (nprocess){
                NSMutableArray * array = [[NSMutableArray alloc] init];
                
                for (int i = nprocess - 1; i >= 0; i--){
                    pid_t pid = process[i].kp_proc.p_pid;
                    NSString * processID = [[NSString alloc] initWithFormat:@"%d", pid];
                    NSString * processName = [self getProcessNameWithPid:pid];
                    if (processName.length > 0 && processID.length > 0) {
                        NSDictionary * dict = @{@"ProcessName" : processName, @"ProcessID" : processID };
                        [array addObject:dict];
                    }
                }
                
                free(process);
                return [array copy];
            }
        }
    }
    
    return nil;
}

- (NSString *)getProcessNameWithPid:(pid_t)pid
{
    NSString *processName = @"";
    char pathBuffer [PROC_PIDPATHINFO_MAXSIZE];
    proc_pidpath(pid, pathBuffer, sizeof(pathBuffer));
    
    char nameBuffer[256];
    
    int position = (int)strlen(pathBuffer);
    while(position >= 0 && pathBuffer[position] != '/')
    {
        position--;
    }
    
    strcpy(nameBuffer, pathBuffer + position + 1);
    
    processName = [NSString stringWithUTF8String:nameBuffer];
    return processName;
}

やや複雑な、しかし、アイデアは参照を行うが、この方法では、:それは巧みPROCESSIDを通じて、プロセスパスのパスを取得し、パスがlastComponentその名のパスをインターセプトして、プロセス名とIDを取得します。
試験後、本方法はまた、正常OSX10.15betaで取得することができます。

これらは間違っているならば、私は批判を懇願、要約で使用されるだけで個人的なアイテムです!あなたがあなたの助け、サポート親指アップのために持っている場合は、あなたに感謝!

参考資料

公開された49元の記事 ウォンの賞賛5 ビュー20000 +

おすすめ

転載: blog.csdn.net/auspark/article/details/104441010