我知道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运行的程序的启动参数?