1

检查屏幕保护程序是否正在运行时,我遇到了无穷无尽的问题。如果我使用NSTaskwith ps,它会在很多用户上崩溃或挂起。如果我使用通知,对其他人来说似乎参差不齐。

关于为什么这NSTask是片状的任何想法?(是的,我知道在调试时现在很乱)

  -(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);
}
4

1 回答 1

1

您想知道屏幕保护程序是否正在运行的更高层次的目的是什么?可能有更好的方法来实现这一点。

如果您尝试诊断崩溃或挂起,请显示崩溃或挂起报告。

无论如何,如果你要为此生成一个子进程,你可能应该使用killall -0 ScreenSaverEngine而不是ps. killall将为您按名称查找进程。使用信号 0 ( -0) 意味着“只是测试进程是否存在,而不是实际发出信号”。确保[task setStandardError:[NSFileHandle fileHandleWithNullDevice]]其输出无处可去。您可以通过在任务终止后检查任务的成功或失败状态来确定进程是否存在。

于 2013-01-28T23:43:47.420 回答