NSTask waitUntilExit未按预期工作

时间:2012-04-16 13:10:29

标签: objective-c

我正在使用FSEventStreamCreate来监视.Trash目录。 我的回调函数是一个静态函数,只要.Trash改变就会执行。

在回调函数中,我需要运行一个脚本来获取一些状态,通过NSPask使用NSPipe。当第一次执行[ls waitUntillExit]时,函数再次从头开始执行。当程序第二次到达时,程序通常从[ls waitUntillExit]继续。我的代码中有什么问题。 [从1到2的代码执行2次]

这是我的FSEvent的myCallbackFunction代码。

static void myCallbackFunction(
                           ConstFSEventStreamRef streamRef,
                           void *clientCallBackInfo,
                           size_t numEvents,
                           void *eventPaths,
                           const FSEventStreamEventFlags eventFlags[],
                           const FSEventStreamEventId eventIds[])
{

    ////////////////number 1////////////   
    int i;


    FILE *fp;

    char path[1035];

    /* Open the command for reading. */
    fp = popen("/bin/ls ~/.Trash/POC3.app", "r");

    if (fp == NULL) {
        printf("Failed to run command\n" );
        exit(0);
    }
    i=0;
    while (fgets(path, sizeof(path)-1, fp) != NULL) {
        i++;
    }///////if the file POC.app exists in trash execute this//////////////////
    if(i!=0){


        NSTask *ls=[[NSTask alloc]init] ;
        NSPipe *pipe1=[NSPipe pipe];
        NSData *data ;
        NSString *tmpString;

        [ls setStandardOutput:pipe1];
        NSString *execPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"script"];
        [ls setLaunchPath:execPath];
        [ls setArguments:[NSArray arrayWithObjects:@"hello",nil]];

        [ls launch];
        [ls waitUntilExit];
        ///////////////number 2/////////////////

        data = [[[ls standardOutput] fileHandleForReading] availableData];






        if ((data != nil) && [data length]) {

            tmpString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];




         }

    //some other functionality follows here
    }
}

1 个答案:

答案 0 :(得分:0)

绝对是一个僵局。在脚本退出之前,您不会读取脚本的输出。如果因为管道缓冲区已满而阻塞,它将永远不会终止。