0

我正在使用 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
    }
}
4

1 回答 1

0

肯定有僵局。在脚本退出之前,您不会阅读脚本的输出。如果它因为管道缓冲区已满而阻塞,它将永远不会终止。

于 2012-04-16T13:22:01.090 回答