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:でGetBSDProcessList
GET
ことにより、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で取得することができます。
これらは間違っているならば、私は批判を懇願、要約で使用されるだけで個人的なアイテムです!あなたがあなたの助け、サポート親指アップのために持っている場合は、あなたに感謝!