objective-c - NSPipe 输入来 self 无法控制的进程

标签 objective-c c ipc nstask nspipe

我有一个用 Objective-C 编写的应用程序,并且正在尝试从用 C 编写的应用程序接收消息。看来我有两个选择...XPC 服务和管道。关于 NSPipe - 我正在尝试确定如何打开一个管道来监视给定位置的文件中的新数据。简而言之,我需要知道新数据何时写入路径 XYZ 处的文件。然而,我在 NSPipe 中找到的所有示例似乎都属于相互通信的任务,并且所有这些任务都是由同一个中央应用程序生成和拥有的......所以它们从不指定要监视的文件。相反,他们只是将一个过程的输入分配为另一个过程的输出。由于我不拥有基于 C 的应用程序,因此我不能只将该 C 程序的输出分配为我拥有的任务的输入。相反,我期望将数据写入文件,并且需要知道数据何时到达。我怎样才能实现这个目标?

最佳答案

我不确定从哪里得到这段代码,但我很确定我只是从 stackoverflow 中的某个地方复制了这段代码。此代码监视文件,并在其监视的文件发生更改时执行 if() 条件内的语句。

-(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);
}

编辑:我找到了我复制的原始答案:https://stackoverflow.com/a/26304208/7433869

关于objective-c - NSPipe 输入来 self 无法控制的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46778828/

相关文章:

ios - 如何在iOS中动态绘制圆形、椭圆形、矩形等形状?

c - gcc 在优化期间更改映射变量的地址

ios - 添加新模型版本后,Coredata 找不到模型

c - 什么是 __builtin_expect() 原型(prototype)?

c++ - 如何使用 ULARGE_INTEGER 进行算术运算

c - 终止线程池

在 c 中创建一个在后台运行但在我请求它之前不执行其任务的守护进程

c++ - 使用 ShellExecute 的进程之间的 IPC

objective-c - 从子 UIView 影响 UIViewController

ios - 自定义 View 不适合 UItableview 中的标题