From 01a76753a060c27e26ac691c0d69f99b975038e5 Mon Sep 17 00:00:00 2001 From: Angelo Marletta Date: Tue, 19 Jun 2012 01:23:06 +0100 Subject: process_iterator working for linux and freebsd. tests pass --- src/Makefile | 10 ++++---- src/process_iterator.c | 70 ++++++++++++++++++++++++++++++++++++++++++-------- src/process_iterator.h | 2 +- 3 files changed, 66 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/Makefile b/src/Makefile index f7a71ed..7e2bc94 100644 --- a/src/Makefile +++ b/src/Makefile @@ -9,10 +9,10 @@ ifeq ($(UNAME), FreeBSD) LIBS+=-lkvm endif -all:: $(TARGETS) process_iterator.o +all:: process_iterator.o -cpulimit: cpulimit.c $(LIBS) - $(CC) -o cpulimit cpulimit.c $(LIBS) $(CFLAGS) +#cpulimit: cpulimit.c $(LIBS) +# $(CC) -o cpulimit cpulimit.c $(LIBS) $(CFLAGS) process_iterator.o: process_iterator.c process_iterator.h $(CC) -c process_iterator.c $(CFLAGS) @@ -26,8 +26,8 @@ process_group.o: process_group.c process_group.h process_iterator.o list.o #process.o: process.c process.h # $(CC) -c process.c $(CFLAGS) -procutils.o: procutils.c procutils.h - $(CC) -c procutils.c $(CFLAGS) +#procutils.o: procutils.c procutils.h +# $(CC) -c procutils.c $(CFLAGS) clean: rm -f *~ *.o $(TARGETS) diff --git a/src/process_iterator.c b/src/process_iterator.c index eb34d62..ff13035 100644 --- a/src/process_iterator.c +++ b/src/process_iterator.c @@ -108,7 +108,7 @@ static int is_child_of(pid_t child_pid, pid_t parent_pid) return ppid == parent_pid; } -int read_next_process(struct process_iterator *it, struct process *p) +int get_next_process(struct process_iterator *it, struct process *p) { if (it->dip == NULL) { @@ -181,17 +181,67 @@ int init_process_iterator(struct process_iterator *it, struct process_filter *fi return 0; } -int read_next_process(struct process_iterator *it, struct process *p) { - if (it->i == it->count) return -1; - p->pid = it->procs[it->i].ki_pid; - p->ppid = it->procs[it->i].ki_ppid; - p->cputime = it->procs[it->i].ki_runtime / 1000; - p->starttime = it->procs[it->i].ki_start.tv_sec; - it->i++; - if (it->i == it->count) return -1; +static void kproc2proc(struct kinfo_proc *kproc, struct process *proc) +{ + proc->pid = kproc->ki_pid; + proc->ppid = kproc->ki_ppid; + proc->cputime = kproc->ki_runtime / 1000; + proc->starttime = kproc->ki_start.tv_sec; +} + +static int get_single_process(pid_t pid, struct process *process) +{ + kvm_t *kd; + int count; + char errbuf[_POSIX2_LINE_MAX]; + /* Open the kvm interface, get a descriptor */ + if ((kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf)) == NULL) { + /* fprintf(stderr, "kvm_open: %s\n", errbuf); */ + fprintf(stderr, "kvm_open: %s", errbuf); + return -1; + } + struct kinfo_proc *kproc = kvm_getprocs(kd, KERN_PROC_PID, pid, &count); + kvm_close(kd); + if (count == 0 || kproc == NULL) + { + fprintf(stderr, "kvm_getprocs: %s", kvm_geterr(kd)); + return -1; + } + kproc2proc(kproc, process); return 0; } +int get_next_process(struct process_iterator *it, struct process *p) { + if (it->i == it->count) + { + return -1; + } + if (it->filter->pid > 0 && !it->filter->include_children) + { + get_single_process(it->filter->pid, p); + it->i = it->count = 1; + return 0; + } + while (it->i < it->count) + { + if (it->filter->pid > 0 && it->filter->include_children) + { + kproc2proc(&(it->procs[it->i]), p); + it->i++; + if (p->pid != it->filter->pid && p->ppid != it->filter->pid) + continue; + return 0; + } + else if (it->filter->pid == 0) + { + kproc2proc(&(it->procs[it->i]), p); + it->i++; + return 0; + } + } + return -1; +} + int close_process_iterator(struct process_iterator *it) { return 0; } @@ -202,7 +252,7 @@ int init_process_iterator(struct process_iterator *it) { return 0; } -int read_next_process(struct process_iterator *it, struct process *p) { +int get_next_process(struct process_iterator *it, struct process *p) { return -1; } diff --git a/src/process_iterator.h b/src/process_iterator.h index 711cf3b..1e118f4 100644 --- a/src/process_iterator.h +++ b/src/process_iterator.h @@ -89,7 +89,7 @@ struct process_iterator { int init_process_iterator(struct process_iterator *i, struct process_filter *filter); -int read_next_process(struct process_iterator *i, struct process *p); +int get_next_process(struct process_iterator *i, struct process *p); int close_process_iterator(struct process_iterator *i); -- cgit v1.2.3