繁体   English   中英

将NSTask与ps结合使用以验证进程正在运行的代码

[英]Code to use NSTask with ps to verify a process is running

我在检查屏幕保护程序是否正在运行时遇到无尽的问题。 如果我将NSTaskps 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM