2017-10-16 13 views
0

J'ai une application écrite en Objective-C et j'essaie de recevoir des messages d'une application écrite en C. Il semble que j'ai deux options ... les services XPC et Piping. En ce qui concerne NSPipe - j'essaie de déterminer comment je peux ouvrir un tuyau qui regarde un fichier à un endroit donné pour de nouvelles données. Autrement dit, j'ai besoin de savoir quand de nouvelles données sont écrites dans un fichier au chemin XYZ. Cependant, tous les exemples que je trouve avec NSPipe semblent être parmi les tâches qui communiquent entre elles, et toutes ces tâches sont engendrées et possédées par la même application centrale ... donc elles ne spécifient jamais un fichier à regarder. Ils assignent simplement les entrées d'un processus comme les sorties d'un autre. Puisque je ne possède pas l'application basée sur C, je ne peux pas simplement assigner la sortie de ce programme C comme l'entrée d'une tâche que je possède. Au lieu de cela, je m'attends à ce que les données soient écrites dans un fichier, et j'ai besoin de savoir quand elles arrivent. Comment puis-je atteindre cet objectif?Entrée NSPipe du processus Je ne contrôle pas

Répondre

0

Je ne suis pas sûr d'où j'ai eu ce code, mais je suis sûr que j'ai copié ce code de quelque part dans stackoverflow seulement. Ce code surveille le fichier et exécute les instructions à l'intérieur de la condition if() lorsque le fichier qu'il regarde a changé.

-(void)monitorFile:(NSString*) path 
{ 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
int fildes = open([path UTF8String], O_EVTONLY); 

__block typeof(self) blockSelf = self; 
__block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fildes, 
                  DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | 
                  DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | 
                  DISPATCH_VNODE_REVOKE, queue); 
dispatch_source_set_event_handler(source, ^{ 
    unsigned long flags = dispatch_source_get_data(source); 
    if(flags) 
    { 
     // Do Stuff here 
     [blockSelf monitorFile:path]; 
    } 
}); 
dispatch_source_set_cancel_handler(source, ^(void) { 
    close(fildes); 
}); 
dispatch_resume(source); 
} 

Edit: je l'ai trouvé la réponse originale à partir de laquelle je copiais de: https://stackoverflow.com/a/26304208/7433869