如何解决NSTask launch 或 popen 在 macOS 中启动简单的 Bash 脚本需要 15-20 秒
我有简单的代码可以基于简单的 popen 和读取缓冲区从 C++ 在 macOS 中启动外部进程。启动我的外部脚本大约需要 15-20 秒。
char buffer[128];
std::string result = "";
FILE* pipe = popen(cmd,"r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (fgets(buffer,sizeof buffer,pipe) != NULL) {
result += buffer;
}
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
然后我尝试了基于 [NSTask launch]
的其他方法:
NSString *commandToRun = FUN_ConvertCStringToNSString(cmd);
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
NSArray *arguments = [NSArray arrayWithObjects:
@"-c",[NSString stringWithFormat:@"%@",commandToRun],nil];
NSLog(@"run command:%@",commandToRun);
[task setArguments:arguments];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[task setQualityOfService:NSQualityOfServiceUserInteractive];
[task launch];
NSData *data = [file readDataToEndOfFile];
NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
const char *cString = [output UTF8String];
同样,这里也需要 15-20 秒来启动脚本或应用程序。
从终端运行脚本需要几毫秒并且不相关。我做了一个实验并创建了非常简单的 Bash 脚本,该脚本将当前日期/秒打印到标准输出:
echo `date`
我测量了 [task launch]
执行和脚本最终启动之间的时间,它总是大约 15-20 秒,即运行非常简单的外部程序总是需要 [task launch]
大量时间.任何线索为什么会这样?这是苹果公证的问题吗?我需要一些特定的权利吗?
17:38:02,075 4353650112 [DEBUG] Execute...
Sun May 16 17:38:18 CEST 2021
done!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。