gpt4 book ai didi

xcode - 如何捕获 OSX 所有正在运行的进程的列表并将它们保存为 Xcode/Cocoa 中的文件?

转载 作者:行者123 更新时间:2023-12-03 16:10:19 25 4
gpt4 key购买 nike

我想要捕获 OSX 所有正在运行的进程的列表,并将它们保存为 Xcode/Cocoa 中的文件。我用谷歌搜索了这个,我发现的是:

[myWorkspace runningApplications];

我不知道该怎么做。请帮忙!谢谢!

最佳答案

QA1123 中所述,“进程”在 Mac 上意味着多种不同的事物(并且随着时间的推移而变化)。

Cocoa(或 Carbon,或曾经经典)级别的“流程”基本上是最终用户所认为的流程:应用程序、FBA、启动项目等。 BSD 的级别是受过 Unix 训练的系统管理员所认为的进程:出现在 ps 中的东西。一个高层进程可以有多个BSD进程;反过来过去也是可能的(在经典模式下);您还可以拥有没有高级进程的 BSD 进程;等等

如果您想要高级定义,请忘记 QA,您提到的方法 -[NSWorkspace runningApplications] 返回的正是您想要的:一个包含每个此类应用程序的对象的数组,以及这些对象拥有您想要的所有信息。如何将它们保存在文件中取决于您想要每个应用程序的哪些信息、您想要保存该信息的格式等。这是一个完整的示例应用程序,它将每个应用程序的 URL(每行一个)保存到一个文件中称为“./appslist”:

#include <Cocoa/Cocoa.h>

int main(int argc, char *argv[]) {
NSString *output = [NSString string];
for (NSRunningApplication *app in
[[NSWorkspace sharedWorkspace] runningApplications]) {
output = [output stringByAppendingFormat:@"%@\n",
[[app bundleURL] absoluteString]];
}
[output writeToFile:@"./appslist"
atomically:YES
encoding:NSUTF8StringEncoding
error:NULL];
return 0;
}

如果您想要低级定义,那么 QA 中的代码仍然是准确的。或者您可以只是exec(或systemNSTask)ps

无论如何,这里有一个示例(使用 QA 中的代码)将每个正在运行的进程的 pid 打印到名为“./bsdlist”的本地文件:

int main(int argc, char *argv[]) {
kinfo_proc *procs;
size_t count;
int err = GetBSDProcessList(&procs, &count);
if (err) return err;
FILE *f = fopen("./bsdlist", "w");
for (size_t i=0; i!=count; ++i) {
fprintf(f, "%d\n", procs[i].kp_proc.p_pid);
}
fclose(f);
free(procs);
}

如果您喜欢编写 ps 脚本的想法,如上所述,有多种方法可以实现此目的。

Dominik 的答案中提到的 DDTask 库看起来是最简单的方法。如果你想直接使用 NSTask ,需要多一点代码来为 stdout 等设置 NSPipe 。有一个很好的通用 CocoaDev (它是脚本 ls 而不是 ps,但想法都是一样的。)

或者你可以下降到较低的级别。您可以显式地 fork/exec 并通过 stdout 传递结果,但 popen 函数旨在包装所有这些内容,它是一个使用起来方便很多。 The GNU C Programming Tutorial展示如何popen ps -A 并将其通过管道传输到grep init;这前半部分就是您所需要的。

无论您采用哪种方式,问题都是您将返回一堆必须解析的字符串。最好的办法是将不同的标志传递给 ps 以仅获取您真正想要的内容。如果您想要的只是命令行,ps -ax -ocommand= 只会给您每行一个命令行 - 没有要跳过的标题行,没有要解析的列,等等。

如果您担心效率:QA 表示“执行 ps 将需要解析工具的输出,并且不会像 list 1 那样有效地使用系统资源。”这是真的;将 sysctl 输出格式化为字符串只是为了将它们通过管道传递并再次解析它们是额外的工作,必须占用一些 CPU 时间。但除非你这样做了数百万次,否则我怀疑它是否足以产生影响。最好的方法(对于大多数情况)是首先编写更简单的代码并测试它是否足够快;如果是,那么您就完成了。

关于xcode - 如何捕获 OSX 所有正在运行的进程的列表并将它们保存为 Xcode/Cocoa 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com