Merge branch 'master' of github.com:happyfish100/libfastcommon
commit
7b61231508
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue