你有什么想法解释为什么这个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);
}发布于 2013-01-29 07:43:47
你想知道屏幕保护程序是否正在运行的更高级别的目的是什么?也许有一种更好的方法来实现这一点。
如果您正在尝试诊断崩溃或挂起,请显示崩溃或挂起报告。
无论如何,如果您要为此派生一个子进程,那么您可能应该使用killall -0 ScreenSaverEngine而不是ps。killall将按名称为您查找一个进程。使用信号0 (-0)意味着“只测试进程的存在,而不是实际发出信号”。执行[task setStandardError:[NSFileHandle fileHandleWithNullDevice]]以确保其输出不会出现在任何地方。您可以通过检查任务在终止后的成功或失败状态来确定该进程是否存在。
https://stackoverflow.com/questions/14568335
复制相似问题