Merge branch 'master' of github.com:happyfish100/libfastcommon

pull/5/head
yuqing 2016-01-27 22:51:52 +08:00
commit 7b61231508
3 changed files with 146 additions and 5 deletions

View File

@ -264,7 +264,7 @@ int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *coun
#endif #endif
} }
#ifdef OS_LINUX #if defined(OS_LINUX) || defined(OS_FREEBSD)
typedef struct fast_process_array { typedef struct fast_process_array {
struct fast_process_info *procs; struct fast_process_info *procs;
@ -272,6 +272,7 @@ typedef struct fast_process_array {
int count; int count;
} FastProcessArray; } FastProcessArray;
#if defined(OS_LINUX)
static int check_process_capacity(FastProcessArray *proc_array) static int check_process_capacity(FastProcessArray *proc_array)
{ {
struct fast_process_info *procs; struct fast_process_info *procs;
@ -420,13 +421,30 @@ int get_processes(struct fast_process_info **processes, int *count)
char filename[128]; char filename[128];
char buff[4096]; char buff[4096];
DIR *dir; DIR *dir;
struct sysinfo info;
struct dirent *ent; struct dirent *ent;
FastProcessArray proc_array; FastProcessArray proc_array;
int64_t bytes; int64_t bytes;
int tickets;
int result; int result;
int len; int len;
int i; 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); dir = opendir(dirname);
if (dir == NULL) if (dir == NULL)
{ {
@ -471,6 +489,9 @@ int get_processes(struct fast_process_info **processes, int *count)
} }
parse_proc_stat(buff, bytes, proc_array.procs + proc_array.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++; proc_array.count++;
} }
closedir(dir); closedir(dir);
@ -479,5 +500,124 @@ int get_processes(struct fast_process_info **processes, int *count)
*processes = proc_array.procs; *processes = proc_array.procs;
return result; 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;
int i;
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; i<nproc; i++)
{
process->field_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 #endif

View File

@ -47,7 +47,7 @@ extern "C" {
char f_mntonname[MNAMELEN]; /* directory on which mounted */ char f_mntonname[MNAMELEN]; /* directory on which mounted */
} FastStatFS; } FastStatFS;
#ifdef OS_LINUX #if defined(OS_LINUX) || defined(OS_FREEBSD)
typedef struct fast_process_info { typedef struct fast_process_info {
int field_count; //field count in /proc/$pid/stat int field_count; //field count in /proc/$pid/stat
int pid; int pid;
@ -127,7 +127,7 @@ int get_uptime(time_t *uptime);
*/ */
int get_mounted_filesystems(struct fast_statfs *stats, const int size, int *count); 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 /** get processes
* parameters: * parameters:
* processes: return the processes * processes: return the processes

View File

@ -83,14 +83,15 @@ int main(int argc, char *argv[])
stats[i].f_ffree); stats[i].f_ffree);
} }
#ifdef OS_LINUX #if defined(OS_LINUX) || defined(OS_FREEBSD)
{ {
FastProcessInfo *processes; FastProcessInfo *processes;
get_processes(&processes, &count); get_processes(&processes, &count);
printf("process count: %d\n", count); printf("process count: %d\n", count);
for (i=0; i<count; i++) for (i=0; i<count; i++)
{ {
printf("%d %d %c %s\n", processes[i].field_count, processes[i].pid, processes[i].state, processes[i].comm); printf("%d %d %d %d %s %lld\n", processes[i].field_count, processes[i].pid,
processes[i].ppid, processes[i].state, processes[i].comm, processes[i].starttime);
} }
if (processes != NULL) if (processes != NULL)
{ {