Мне нужно узнать pid процесса SystemUIServer в Mac OS, чтобы передать его AXUIElementCreateApplication (pid);
На оболочке это легко возможно через ps, но как я могу это сделать в C/C++ или Objective-C?
Я проверил бы все запущенные процессы.
pid_t resultPid = -1;
NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
for (NSRunningApplication *app in runningApplications) {
pid_t pid = [app processIdentifier];
if (pid != ((pid_t)-1)) {
AXUIElementRef appl = AXUIElementCreateApplication(pid);
id result = nil;
if(AXUIElementCopyAttributeValue(appl, (CFStringRef)NSAccessibilityTitleAttribute, (void *)&result) == kAXErrorSuccess) {
if([((NSString*)result) isEqualToString:@"SystemUIServer"]){
resultPid = pid;
break;
}
}
}
}
Вы также можете использовать UIElementUtilities от Apple (он помогает управлять экземплярами AXUIElementRef), чтобы получить имя процесса.
Благодаря Sudo, Yahoo и Google я нашел следующее решение:
#include <libproc.h>
int getPid(const char* processname)
{
pid_t resultPid = -1;
NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
for (NSRunningApplication *app in runningApplications) {
pid_t pid = [app processIdentifier];
if (pid != ((pid_t)-1)) {
char nameBuffer[512];
proc_name(pid, nameBuffer, sizeof(nameBuffer));
if(!strcmp(processname,nameBuffer)) {
resultPid=pid;
break;
}
}
}
return resultPid;
}
fork
иexecv
для запускаps
в вашем приложении, системный вызов fork () и функцию execv