Роб, спасибо за общий указатель на использование прямого решения в коде, когда это возможно. Я просмотрел упаковку JongAm Park для sysctl
, а также исходный код Apple ps
. Включение займет некоторое время, но теперь я знаю, где искать прямое решение для получения списка процессов.
shellter и tripleee, спасибо за ваши предложения относительно взаимодействия с командами оболочки. Исходя из ваших предложений, я получил три метода работы (!):
В способе 1 используется код возврата команды system
(нет необходимости в egrep -o
):
BOOL processIsRunning = system("ps -Ac | grep 'ProcessName' > /dev/null") == 0;
Метод 2 использует NSTask с параметром оболочки -c
(примечание -c
вместо -e
):
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:@"-c",@"ps -Ac | grep 'ProcessName'",nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
[task release];
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
BOOL processIsRunning = [result length] > 0;
Метод 3 также использует NSTask с опцией оболочки -c
, но в этом случае выполняемая команда - это другая оболочка с собственной опцией -c
(это был единственный способ, который я мог найти после долгих проб и ошибок) для включения конструкции if
в команду, которая должна быть выполнена, конечно, это способ перебор для текущей проблемы):
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:@"-c",@"/bin/sh -c 'if [ \"$(ps -Ac | egrep -o 'ProcessName')\" = \"ProcessName\" ]; then echo 1; else echo 0; fi;'",nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
[task release];
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
BOOL processIsRunning = [result intValue] == 1;
Спасибо всем за прекрасную помощь.