mirror of
https://github.com/xzeldon/htop.git
synced 2025-07-12 04:04:35 +03:00
Linux: add process->starttime and use it for STARTTIME column (#700)
this way a remount of /proc will not reset starttimes and we can also see startup times for processes started before the mount of /proc also record btime (boot time in seconds since epoch) as Linux semi-global
This commit is contained in:

committed by
Hisham Muhammad

parent
ca1cce4ce7
commit
bd1d719a61
@ -47,6 +47,8 @@ in the source distribution for its full text.
|
||||
|
||||
#include "ProcessList.h"
|
||||
|
||||
extern long long btime;
|
||||
|
||||
typedef struct CPUData_ {
|
||||
unsigned long long int totalTime;
|
||||
unsigned long long int userTime;
|
||||
@ -111,7 +113,7 @@ typedef struct LinuxProcessList_ {
|
||||
#endif
|
||||
|
||||
#ifndef PROC_LINE_LENGTH
|
||||
#define PROC_LINE_LENGTH 512
|
||||
#define PROC_LINE_LENGTH 4096
|
||||
#endif
|
||||
|
||||
}*/
|
||||
@ -230,8 +232,8 @@ static void LinuxProcessList_initNetlinkSocket(LinuxProcessList* this) {
|
||||
ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, uid_t userId) {
|
||||
LinuxProcessList* this = xCalloc(1, sizeof(LinuxProcessList));
|
||||
ProcessList* pl = &(this->super);
|
||||
|
||||
ProcessList_init(pl, Class(LinuxProcess), usersTable, pidWhiteList, userId);
|
||||
|
||||
LinuxProcessList_initTtyDrivers(this);
|
||||
|
||||
#ifdef HAVE_DELAYACCT
|
||||
@ -243,13 +245,19 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, ui
|
||||
if (file == NULL) {
|
||||
CRT_fatalError("Cannot open " PROCSTATFILE);
|
||||
}
|
||||
char buffer[PROC_LINE_LENGTH + 1];
|
||||
int cpus = -1;
|
||||
do {
|
||||
cpus++;
|
||||
char * s = fgets(buffer, PROC_LINE_LENGTH, file);
|
||||
(void) s;
|
||||
} while (String_startsWith(buffer, "cpu"));
|
||||
char buffer[PROC_LINE_LENGTH + 1];
|
||||
if (fgets(buffer, PROC_LINE_LENGTH + 1, file) == NULL) {
|
||||
CRT_fatalError("No btime in " PROCSTATFILE);
|
||||
} else if (String_startsWith(buffer, "cpu")) {
|
||||
cpus++;
|
||||
} else if (String_startsWith(buffer, "btime ")) {
|
||||
sscanf(buffer, "btime %lld\n", &btime);
|
||||
break;
|
||||
}
|
||||
} while(true);
|
||||
|
||||
fclose(file);
|
||||
|
||||
pl->cpuCount = MAX(cpus - 1, 1);
|
||||
@ -259,7 +267,6 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList, ui
|
||||
this->cpus[i].totalTime = 1;
|
||||
this->cpus[i].totalPeriod = 1;
|
||||
}
|
||||
|
||||
return pl;
|
||||
}
|
||||
|
||||
@ -355,7 +362,10 @@ static bool LinuxProcessList_readStatFile(Process *process, const char* dirname,
|
||||
location += 1;
|
||||
process->nlwp = strtol(location, &location, 10);
|
||||
location += 1;
|
||||
for (int i=0; i<17; i++) location = strchr(location, ' ')+1;
|
||||
location = strchr(location, ' ')+1;
|
||||
lp->starttime = strtoll(location, &location, 10);
|
||||
location += 1;
|
||||
for (int i=0; i<15; i++) location = strchr(location, ' ')+1;
|
||||
process->exit_signal = strtol(location, &location, 10);
|
||||
location += 1;
|
||||
assert(location != NULL);
|
||||
@ -377,13 +387,6 @@ static bool LinuxProcessList_statProcessDir(Process* process, const char* dirnam
|
||||
if (statok == -1)
|
||||
return false;
|
||||
process->st_uid = sstat.st_uid;
|
||||
|
||||
struct tm date;
|
||||
time_t ctime = sstat.st_ctime;
|
||||
process->starttime_ctime = ctime;
|
||||
(void) localtime_r((time_t*) &ctime, &date);
|
||||
strftime(process->starttime_show, 7, ((ctime > curTime - 86400) ? "%R " : "%b%d "), &date);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user