我正在使用FSEventStreamCreate来监视.Trash目录。 我的回调函数是一个静态函数,只要.Trash改变就会执行。
在回调函数中,我需要运行一个脚本来获取一些状态,通过NSPask使用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
}
}
答案 0 :(得分:0)
绝对是一个僵局。在脚本退出之前,您不会读取脚本的输出。如果因为管道缓冲区已满而阻塞,它将永远不会终止。