[myWorkspace runningApplications];
我不知道该怎么做.请帮忙!谢谢!
解决方法 正如 QA1123中所解释的,“进程”在Mac上意味着多个不同的东西(并随着时间的推移而变化).Cocoa级别的“过程”(或者说是Carbon,或曾经的经典)基本上是最终用户认为的过程:app,fba,launchitem等等. BSD是受过Unix训练的系统管理员所认为的一个过程:在ps中出现的东西.高级进程可以有多个BSD进程;另一种方式也是可能的(在Classic下);你也可以拥有没有高级过程的BSD流程;等等
如果你想要高级定义,忘记QA,你提到的方法 – [NSWorkspace runningApplications]完全返回你想要的东西:一个带有每个这样的app的对象的数组,那些对象拥有你想要的所有信息.如何将它们保存在文件中取决于您想要的每个信息,您希望保存该信息的格式等.这是一个完整的示例应用程序,它将每个应用程序的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(或系统或NSTask)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显示如何打开ps -A并将其传递给grep init;这一切的前半部分就是你所需要的.
无论你走哪条路,问题都在于你要找回你需要解析的乱七八糟的字符串.最好的办法是将不同的标志传递给ps,以便只获得你真正想要的东西.如果你想要的只是命令行,ps -ax -ocommand =将只给你一个,每行一个命令行 – 没有要跳过的标题行,没有要拆分的列等等.
如果你担心效率:QA说“执行ps将需要解析工具的输出,并且不会像清单1那样有效地使用系统资源.”这是真的;将sysctl输出格式化为字符串只是为了将它们传递给管道并再次解析它们是额外的工作,需要花费一些cpu时间.但除非你这样做了数百万次,否则我怀疑它是否足以产生影响.最好的方法(对此,大多数情况)是首先编写更简单的代码并测试它是否足够快;如果是的话,你已经完成了.
总结以上是内存溢出为你收集整理的如何捕获OSX的所有正在运行的进程列表并将它们保存为Xcode / Cocoa中的文件?全部内容,希望文章能够帮你解决如何捕获OSX的所有正在运行的进程列表并将它们保存为Xcode / Cocoa中的文件?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)