[英]Code to use NSTask with ps to verify a process is running
我在检查屏幕保护程序是否正在运行时遇到无尽的问题。 如果我将NSTask
与ps
NSTask
使用,它将崩溃或挂在许多用户上。 如果我使用通知,那么对于其他人来说似乎参差不齐。
关于为什么这个NSTask
是Flakey的任何想法? (是的,我知道现在调试时很乱)
-(BOOL)checkScreenSaverRunning
{
MYLog(@"Building task to check screen saver running");
BOOL foundSaver=FALSE;
NSTask *task;
int i;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/ps"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-ax", nil];
[task setArguments: arguments];
NSPipe *stdpipe;
stdpipe = [NSPipe pipe];
[task setStandardOutput: stdpipe];
NSFileHandle *stdfile;
stdfile = [stdpipe fileHandleForReading];
MYLog(@"Launching task to check screen saver running");
[task launch];
while ([task isRunning]){
NSData *stddata;
stddata = [stdfile readDataToEndOfFile];
if([stddata length]>0){
NSString *stdstring = [[NSString alloc] initWithData:stddata
encoding:NSUTF8StringEncoding];
NSArray *stdReturnValues=[stdstring componentsSeparatedByString:@"\n"];
for(i=0;i<[stdReturnValues count];i++){
if([[stdReturnValues objectAtIndex:i]
rangeOfString:@"ScreenSaverEngine"].location != NSNotFound){
foundSaver=TRUE;
MYLog(@"Found screensaver in running processes");
}
}
[stdstring release];
stdstring=nil;
}
}
MYLog(@"Task ended");
[task release];
if(foundSaver)screenSaverIsActive=TRUE;
else screenSaverIsActive=FALSE;
return(foundSaver);
}
您想要了解屏幕保护程序是否正在运行的更高层次用途是什么? 可能会有更好的方法来实现这一目标。
如果您要诊断崩溃或挂起,请显示崩溃或挂起报告。
无论如何,如果要为此生成子进程,则可能应该使用killall -0 ScreenSaverEngine
而不是ps
。 killall
会为您找到名称的进程。 使用信号0( -0
)意味着“仅测试过程是否存在,实际上不发出信号”。 执行[task setStandardError:[NSFileHandle fileHandleWithNullDevice]]
以确保其输出无处。 您可以通过在任务终止后检查任务的成功或失败状态来确定该过程是否存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.