我正在使用 FSEventStreamCreate 来监视 .Trash 目录。我的回调函数是一个静态函数,它在 .Trash 更改时执行。
在回调函数中,我需要通过 NSTask 和 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
}
}