在Mac OS X中按进程ID获取应用启动参数

时间:2019-05-07 09:42:27

标签: c++ objective-c macos cocoa applescript

我知道Unix的“ ps”命令可以做到这一点,但是它和类似的命令仅针对Unix风格的进程显示命令行。例如,如果我在Finder中双击一个png文件,则Preview.app将打开该png文件。如果我对Preview.app的pid执行ps命令,结果将是:

ps -p 556

PID TTY           TIME CMD
556 ??         0:45.38 /Applications/Preview.app/Contents/MacOS/Preview

可以看到没有命令行(png文件)

此代码和其他基于sysctl的解决方案也充当ps命令:

   int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
   unsigned long buffer_size;
   sysctl(mib, 4, NULL, &buffer_size, NULL, 0);

   struct kinfo_proc *result = (kinfo_proc *)malloc(buffer_size);
   sysctl(mib, 4, result, &buffer_size, NULL, 0);

   int num_procs = buffer_size / sizeof(struct kinfo_proc);
   for (int i = 0; i < num_procs; i++) {
       struct kinfo_proc *pproc = result + i;
       int mib[3] = { CTL_KERN, KERN_PROCARGS, pid_of(pproc) }; 
       char *proc_argv;
       unsigned long argv_len;
       sysctl(mib, 3, NULL, &argv_len, NULL, 0);
       proc_argv = (char *)malloc(sizeof(char) * argv_len);
       sysctl(mib, 3, proc_argv, &argv_len, NULL, 0);
       fwrite(proc_argv, sizeof(char), argv_len, stdout);
       printf("\n");
       free(proc_argv);
   }

是否可以访问Finder运行的程序的启动参数?

0 个答案:

没有答案