我有一个Cocoa命令行程序,我试图运行
有人知道可能出了什么问题吗?
先感谢您的帮助。
这是我的代码:
我还在想,如果问题实际上不在于我的程序是“命令行工具”,因此我不确定它是否有运行循环-正如苹果文档中在NSFileHandle的waitForDataInBackgroundAndNotify消息中所说的那样需要的那样:
NSTask
程序(tshark
来监视网络),并实时从中获取数据。所以我建立了一个 NSFileHandle,调用 waitForDataInBackgroundAndNotify
发送通知,然后注册我的帮助类到通知中心来处理数据,但是没有一条通知被发送到我的帮助类。有人知道可能出了什么问题吗?
先感谢您的帮助。
这是我的代码:
#import <Foundation/Foundation.h>
#import <string>
#import <iostream>
@interface toff : NSObject {}
-(void) process:(NSNotification*)notification;
@end
@implementation toff
-(void) process:(NSNotification*)notification{
printf("Packet caught!\n");
}
@end
int main (int argc, const char * argv[]){
@autoreleasepool {
NSTask* tshark = [[NSTask alloc] init];
NSPipe* p = [NSPipe pipe];
NSFileHandle* read = [p fileHandleForReading];
toff* t1 = [[toff alloc] init];
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[read waitForDataInBackgroundAndNotify];
[nc addObserver:t1 selector:@selector(process:) name:nil object:nil];
printf("Type 'stop' to stop monitoring network traffic.\n");
[tshark setLaunchPath:@"/usr/local/bin/tshark"];
[tshark setStandardOutput:p];
[tshark launch];
while(1){
std::string buffer;
getline(std::cin, buffer);
if(buffer.empty()) continue;
else if(buffer.compare("stop") == 0){
[tshark interrupt];
break;
}
}
//NSData* dataRead = [read readDataToEndOfFile];
//NSLog(@"Data: %@", dataRead);
//NSString* stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
//NSLog(@"Output: %@", stringRead);
}
return 0;
}
编辑: 当我取消代码的注释并删除所有通知内容后,任务完成后从文件句柄提取了所有所需的数据。我还在想,如果问题实际上不在于我的程序是“命令行工具”,因此我不确定它是否有运行循环-正如苹果文档中在NSFileHandle的waitForDataInBackgroundAndNotify消息中所说的那样需要的那样:
您必须从具有活动运行循环的线程中调用此方法。
addObserver:selector:name:object:
这个消息更具体一些。目前你正在注册任何通知,而不仅仅是NSFileHandleReadCompletionNotification
通知。 - Peter HoseyNSFileHandle
传递的数据在某种程度上被缓冲 - 不知道如何摆脱它)。启动后,它会等待一段时间,然后写入“Packet caught”一次 - 然后什么也不做。如果我取消注释1,那么它会等待一段时间,然后无限次地写入“Packet caught”。最后,当我尝试提取数据并取消注释_2-5_时,它会等待一段时间,写入第_2和3_行,然后冻结。没有崩溃,没有错误,只是无法提取数据。 - PhoenixS