2012-04-16 6 views
0

私はFSEventStreamCreateを使用して.Trashディレクトリを監視しています。 私のコールバック関数は静的関数で、.Trashが変更されるたびに実行されます。NSTask waitUntilExitが期待通りに機能しない

コールバック関数では、NSPipeを使用してステータスを取得するために1つのスクリプトを実行する必要があります。 [ls waitUntillExit]が初めて実行されると、関数は最初から再び実行されます。プログラムは[ls waitUntillExit]から2回目に達すると通常通り続きます。私のコードの問題は何ですか? [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

デッドロックがあります。スクリプトが終了するまで、スクリプトの出力を読み取ることはありません。パイプバッファがいっぱいになってブロックすると、決して終了しません。

関連する問題