使用 NSTask 和 NSPipe 导致 CPU 使用率 100%

2024-01-08

我正在尝试使用 NSTask 运行一个简单的 bash 脚本并将输出定向到文本视图。任务执行后,我的应用程序的 CPU 使用率为 100%,即使它是一个简单的任务echo(目前)。

我创建了一个全新的项目来隔离该问题:

@interface AppDelegate ()
@property (nonatomic) NSTask *task;
@property (nonatomic) NSPipe *pipe;
@end

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.pipe = [NSPipe pipe];
    self.pipe.fileHandleForReading.readabilityHandler = ^(NSFileHandle *h) {
        NSLog(@"Read: %@", [h readDataToEndOfFile]);
    };

    self.task = [[NSTask alloc] init];
    self.task.launchPath = @"/bin/bash";
    self.task.arguments = @[@"-c", @"echo test"];
    self.task.standardOutput = self.pipe;
    [self.task launch];
}
@end

它被正确执行并且输出(作为NSData) 记录为NSLog:

PipeTest[3933:2623] Read: <74657374 0a>

然而,CPU 使用率一直保持在 100%,直到我终止我的应用程序。

EDIT:

时间分析器测试返回下面的列表,但我不确定如何解释它。


文件句柄保持打开状态?

@interface AppDelegate ()
@property (nonatomic) NSTask *task;
@property (nonatomic) NSPipe *pipe;
@end

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.pipe = [NSPipe pipe];
    self.pipe.fileHandleForReading.readabilityHandler = ^(NSFileHandle *h) {
        NSLog(@"Read: %@", [h readDataToEndOfFile]);
        [h closeFile];
    };

    self.task = [[NSTask alloc] init];
    self.task.launchPath = @"/bin/bash";
    self.task.arguments = @[@"-c", @"echo test"];
    self.task.standardOutput = self.pipe;
    [self.task launch];
}

关闭文件NSFileHandle h看来你的 CPU 使用率恢复正常了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSTask 和 NSPipe 导致 CPU 使用率 100% 的相关文章

随机推荐