From 4421133912c52f5db03d879a9a192d6dee4af836 Mon Sep 17 00:00:00 2001 From: yuqing Date: Wed, 27 Jan 2016 17:50:18 +0800 Subject: [PATCH 1/3] get_processes support FreeBSD --- src/system_info.c | 121 +++++++++++++++++++++++++++++++++++++++- src/system_info.h | 2 +- src/tests/test_mblock.c | 2 +- 3 files changed, 122 insertions(+), 3 deletions(-) diff --git a/src/system_info.c b/src/system_info.c index 426112c..b20b6e1 100644 --- a/src/system_info.c +++ b/src/system_info.c @@ -264,7 +264,7 @@ int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *coun #endif } -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_FREEBSD) typedef struct fast_process_array { struct fast_process_info *procs; @@ -272,6 +272,7 @@ typedef struct fast_process_array { int count; } FastProcessArray; +#if defined(OS_LINUX) static int check_process_capacity(FastProcessArray *proc_array) { struct fast_process_info *procs; @@ -479,5 +480,123 @@ int get_processes(struct fast_process_info **processes, int *count) *processes = proc_array.procs; return result; } + +#elif defined(OS_FREEBSD) + +int get_processes(struct fast_process_info **processes, int *count) +{ + struct kinfo_proc *procs; + struct fast_process_info *process; + int mib[4]; + size_t size; + int bytes; + int nproc; + bool success; + + *count = 0; + *processes = NULL; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_ALL; + mib[3] = 0; + size = 0; + if (sysctl(mib, 4, NULL, &size, NULL, 0) < 0) + { + logError("file: "__FILE__", line: %d, " \ + "call sysctl fail, " \ + "errno: %d, error info: %s", \ + __LINE__, errno, STRERROR(errno)); + return errno != 0 ? errno : EPERM; + } + + nproc = size / sizeof(struct kinfo_proc); + if (nproc == 0) { + return ENOENT; + } + + success = false; + procs = NULL; + for (i=0; i<10; i++) + { + nproc += 32; + if (procs != NULL) + { + free(procs); + } + + size = sizeof(struct kinfo_proc) * nproc; + procs = (struct kinfo_proc *)malloc(size); + if (procs == NULL) + { + logError("file: "__FILE__", line: %d, " \ + "malloc %d bytes fail, " \ + "errno: %d, error info: %s", \ + __LINE__, (int)size, errno, STRERROR(errno)); + return errno != 0 ? errno : ENOMEM; + } + + if (sysctl(mib, 4, procs, &size, NULL, 0) == 0) + { + success = true; + break; + } + + if (errno != ENOMEM) + { + logError("file: "__FILE__", line: %d, " \ + "call sysctl fail, " \ + "errno: %d, error info: %s", \ + __LINE__, errno, STRERROR(errno)); + free(procs); + return errno != 0 ? errno : EPERM; + } + } + + if (!success) + { + free(procs); + return ENOSPC; + } + + nproc = size / sizeof(struct kinfo_proc); + + bytes = sizeof(struct fast_process_info) * nproc; + *processes = (struct fast_process_info *)malloc(bytes); + if (*processes == NULL) + { + logError("file: "__FILE__", line: %d, " + "malloc %d bytes fail", __LINE__, bytes); + free(procs); + return ENOMEM; + } + memset(*processes, 0, bytes); + process = *processes; + for (i=0; ifield_count = 9; + snprintf(process->comm, sizeof(process->comm), + "%s", procs[i].kp_proc.p_comm); + process->pid = procs[i].kp_proc.p_pid; + process->ppid = procs[i].kp_eproc.e_ppid; + process->starttime = procs[i].kp_proc.p_starttime.tv_sec; + process->flags = procs[i].kp_proc.p_flag; + process->state = procs[i].kp_proc.p_stat; + + process->sigignore = procs[i].kp_proc.p_sigignore; + process->sigcatch = procs[i].kp_proc.p_sigcatch; + process->priority = procs[i].kp_proc.p_priority; + + //process->uid = procs[i].kp_eproc.e_pcred.p_ruid; + //process->gid = procs[i].kp_eproc.e_pcred.p_rgid; + + process++; + } + + free(procs); + *count = nproc; + return 0; +} +#endif #endif diff --git a/src/system_info.h b/src/system_info.h index 7609c57..50bb305 100644 --- a/src/system_info.h +++ b/src/system_info.h @@ -127,7 +127,7 @@ int get_uptime(time_t *uptime); */ int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *count); -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_FREEBSD) /** get processes * parameters: * processes: return the processes diff --git a/src/tests/test_mblock.c b/src/tests/test_mblock.c index c3d3e0c..eba3534 100644 --- a/src/tests/test_mblock.c +++ b/src/tests/test_mblock.c @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) stats[i].f_ffree); } -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_FREEBSD) { FastProcessInfo *processes; get_processes(&processes, &count); From 8a77902f347b7a63d079de115b16a32e520465b4 Mon Sep 17 00:00:00 2001 From: Yu Qing Date: Wed, 27 Jan 2016 18:14:36 +0800 Subject: [PATCH 2/3] iOS test ok --- src/system_info.c | 1 + src/system_info.h | 2 +- src/tests/test_mblock.c | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/system_info.c b/src/system_info.c index b20b6e1..01ff7ec 100644 --- a/src/system_info.c +++ b/src/system_info.c @@ -491,6 +491,7 @@ int get_processes(struct fast_process_info **processes, int *count) size_t size; int bytes; int nproc; + int i; bool success; *count = 0; diff --git a/src/system_info.h b/src/system_info.h index 50bb305..41f2d81 100644 --- a/src/system_info.h +++ b/src/system_info.h @@ -47,7 +47,7 @@ extern "C" { char f_mntonname[MNAMELEN]; /* directory on which mounted */ } FastStatFS; -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_FREEBSD) typedef struct fast_process_info { int field_count; //field count in /proc/$pid/stat int pid; diff --git a/src/tests/test_mblock.c b/src/tests/test_mblock.c index eba3534..b033516 100644 --- a/src/tests/test_mblock.c +++ b/src/tests/test_mblock.c @@ -90,7 +90,8 @@ int main(int argc, char *argv[]) printf("process count: %d\n", count); for (i=0; i Date: Wed, 27 Jan 2016 18:38:35 +0800 Subject: [PATCH 3/3] linux process starttime as Unix timestamp --- src/system_info.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/system_info.c b/src/system_info.c index 01ff7ec..6b3e1a1 100644 --- a/src/system_info.c +++ b/src/system_info.c @@ -421,13 +421,30 @@ int get_processes(struct fast_process_info **processes, int *count) char filename[128]; char buff[4096]; DIR *dir; + struct sysinfo info; struct dirent *ent; FastProcessArray proc_array; int64_t bytes; + int tickets; int result; int len; int i; + if (sysinfo(&info) == 0) + { + info.uptime = time(NULL) - info.uptime; + } + else + { + info.uptime = 0; + } + + tickets = sysconf(_SC_CLK_TCK); + if (tickets == 0) + { + tickets = 100; + } + dir = opendir(dirname); if (dir == NULL) { @@ -472,6 +489,9 @@ int get_processes(struct fast_process_info **processes, int *count) } parse_proc_stat(buff, bytes, proc_array.procs + proc_array.count); + proc_array.procs[proc_array.count].starttime = + info.uptime + proc_array.procs[proc_array.count]. + starttime / tickets; proc_array.count++; } closedir(dir);