0

执行“readDataToEndOfFile”方法后,应用程序执行停止/挂起。请找到以下代码,如何解决此问题

    - (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath: @"/usr/sbin/tcpdump"];
    [task setArguments: [[NSArray alloc] initWithObjects:@"-l", @"-i",@"en1",@"-A",@"-vvv",@"host",@"www.facebook.com", nil]];

    NSPipe *pipe= [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *fileHandle = [pipe fileHandleForReading];

    [task launch];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name:NSFileHandleDataAvailableNotification object:fileHandle];
    [fileHandle waitForDataInBackgroundAndNotify];

}


- (void)receivedData:(NSNotification *)notif {

    NSFileHandle *fileHandle=notif.object;
    NSData *data = [fileHandle readDataToEndOfFile];

    NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    NSLog(@"result: %@", output);
}
4

2 回答 2

0

尝试使用availableData而不是readDataToEndOfFile

NSFileHandle *fileHandle=notif.object;
NSData *data = [fileHandle availableData];
if (data)
{
// do something
}
于 2014-04-08T07:41:49.630 回答
0

这是旧的并且似乎是孤立的,但是对于那些发现自己在这里的人来说,这里有一些可能有用的信息。

与此问题相关的许多基金会已经发展。我没有尝试解决上面的确切问题。我怀疑它涉及waitUntilExit()方法。

现在NSTaskProcess类(该init方法的文档说它返回一个NSTask)。

这是上述在 Swift 中的当前实现。

func tcDump() throws -> String {
    let task = Process()
    task.executableURL = URL(fileURLWithPath: "/usr/sbin/tcdump")
    task.arguments = ["-1", "-i", "en1", "-A", "-vvv", "host", "www.facebook.com"]
    let pipe = Pipe()
    task.standardOutput = pipe
    
    let fileHandle = pipe.fileHandleForReading
    try task.run()
    task.waitUntilExit()
    let data = fileHandle.readDataToEndOfFile()
    
    if let output = String(data: data, encoding: .utf8) {
        return output
    } else {
        FileHandle.standardError.write("problem with tcdump output\n".data(using:.utf8)!)
        throw NSError(domain: "error", code: 1, userInfo: nil)
    }
}
于 2021-08-12T13:09:45.433 回答