2012-04-16 125 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

確實存在一個死鎖。在腳本退出之前,您不會讀取腳本的輸出。如果由於管道緩衝區已滿而阻塞,它將永遠不會終止。