From cf9d6dd95cb53eca22b36f4321a1ab4ebc56d852 Mon Sep 17 00:00:00 2001 From: Alastair Poole Date: Sun, 16 Aug 2020 14:56:50 +0100 Subject: [PATCH] process: start time (linux) --- src/bin/system/process.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/bin/system/process.c b/src/bin/system/process.c index bed56ec..6235111 100644 --- a/src/bin/system/process.c +++ b/src/bin/system/process.c @@ -254,9 +254,33 @@ _uid(int pid) return uid; } +static int64_t +_boot_time(void) +{ + FILE *f; + int64_t boot_time; + char buf[4096]; + double uptime = 0.0; + + f = fopen("/proc/uptime", "r"); + if (!f) return 0; + + if (fgets(buf, sizeof(buf), f)) + sscanf(buf, "%lf", &uptime); + else boot_time = 0; + + fclose(f); + + if (uptime > 0.0) + boot_time = time(NULL) - (time_t) uptime; + + return boot_time; +} + typedef struct { int pid, ppid, utime, stime, cutime, cstime; int psr, pri, nice, numthreads; + long long int start_time; char state; unsigned int mem_rss, flags; unsigned long mem_virt; @@ -269,6 +293,9 @@ _stat(const char *path, Stat *st) FILE *f; char line[4096]; int dummy, res = 0; + static int64_t boot_time = 0; + + if (!boot_time) boot_time = _boot_time(); memset(st, 0, sizeof(Stat)); @@ -283,11 +310,11 @@ _stat(const char *path, Stat *st) strncpy(st->name, start, end - start); st->name[end - start] = '\0'; res = sscanf(end + 2, "%c %d %d %d %d %d %u %u %u %u %u %d %d %d" - " %d %d %d %u %u %d %lu %u %u %u %u %u %u %u %d %d %d %d %u" + " %d %d %d %u %u %lld %lu %u %u %u %u %u %u %u %d %d %d %d %u" " %d %d %d %d %d %d %d %d %d", &st->state, &st->ppid, &dummy, &dummy, &dummy, &dummy, &st->flags, &dummy, &dummy, &dummy, &dummy, &st->utime, &st->stime, &st->cutime, - &st->cstime, &st->pri, &st->nice, &st->numthreads, &dummy, &dummy, + &st->cstime, &st->pri, &st->nice, &st->numthreads, &dummy, &st->start_time, &st->mem_virt, &st->mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &st->psr, &dummy, &dummy, &dummy, &dummy, &dummy); @@ -296,6 +323,9 @@ _stat(const char *path, Stat *st) if (res != 42) return EINA_FALSE; + st->start_time /= sysconf(_SC_CLK_TCK); + st->start_time += boot_time; + return EINA_TRUE; } @@ -329,6 +359,7 @@ _process_list_linux_get(void) p->ppid = st.ppid; p->uid = _uid(pid); p->cpu_id = st.psr; + p->start = st.start_time; p->state = _process_state_name(st.state); p->cpu_time = st.utime + st.stime; p->nice = st.nice; @@ -391,6 +422,7 @@ proc_info_by_pid(int pid) p->ppid = st.ppid; p->uid = _uid(pid); p->cpu_id = st.psr; + p->start = st.start_time; p->state = _process_state_name(st.state); p->cpu_time = st.utime + st.stime; p->priority = st.pri;