#include #include #include #include #include #include #include #include static void ps_strings(pid_t pid) { kvm_t *kd; struct kinfo_proc *kp; struct ps_strings pss_sysctl, pss; size_t len; ssize_t n; u_long ps_strings; int cnt; kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); if (kd == NULL) err(1, "kvm_open"); kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &cnt); if (kp == NULL) err(1, "kvm_getprocs"); len = sizeof(ps_strings); if (sysctlbyname("kern.ps_strings", &ps_strings, &len, NULL, 0) == -1) err(1, "sysctl: kern.ps_strings"); n = kvm_uread(kd, kp, ps_strings, (char *)&pss, sizeof(pss)); if (n != sizeof(pss)) errx(1, "kvm_uread"); printf("ps_nargvstr\t%u\n", pss.ps_nargvstr); printf("ps_argvstr\t%p\n", pss.ps_argvstr); printf("ps_nenvstr\t%u\n", pss.ps_nenvstr); printf("ps_envstr\t%p\n", pss.ps_envstr); } int main (int argc, char *argv[]) { int i; if (argc < 2) errx(1, "usage: prog pid"); for (i = 1; i < argc; i++) ps_strings(atoi(argv[i])); }