int getdtablecount(void) { struct procstat *procstat; struct kinfo_proc *kipp; struct filestat_list *head; struct filestat *fst; unsigned int fd_count = 0; pid_t pid; unsigned int cnt; procstat = procstat_open_sysctl(); if (procstat == NULL) return 0; pid = getpid(); kipp = procstat_getprocs(procstat, KERN_PROC_PID, pid, &cnt); if (kipp == NULL) return 0; if (cnt != 0) { head = procstat_getfiles(procstat, kipp, 0); if (head == NULL) return 0; fst = STAILQ_LAST(head, filestat, next); fd_count = fst->fs_fd; } procstat_freeprocs(procstat, kipp); return fd_count; }
struct filestat_list* get_procfiles(pid_t pid, struct kinfo_proc **kp, struct procstat **procstat, unsigned int *cnt) { int mflg = 0; // include mmapped files (*procstat) = procstat_open_sysctl(); (*kp) = procstat_getprocs(*procstat, KERN_PROC_PID, pid, cnt); if ((*kp) == NULL || *cnt < 1) return NULL; return procstat_getfiles(*procstat, *kp, mflg); }