2012-04-16 129 views
0

我正在使用FSEventStreamCreate来监视.Trash目录。 我的回调函数是一个静态函数,只要.Trash发生变化就会执行该函数。NSTask waitUntilExit未按预期方式工作

在回调函数中,我需要运行一个脚本来获得一些状态,通过NSPas的NSTask。当第一次执行[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 
    } 
} 

回答

0

确实存在一个死锁。在脚本退出之前,您不会读取脚本的输出。如果由于管道缓冲区已满而阻塞,它将永远不会终止。