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
}
}