Старая тема, но поскольку я работал над теми же проблемами, я подумал, что могу опубликовать свой ответ. Возможно, это будет полезно для кого-то еще. Обратите внимание, этот код не должен использоваться в серьезной производственной среде, но как быстрый и грязный способ получить то, что ищет OP, я думаю, этого будет достаточно. Обратите внимание, что этот код является тем же кодом, что и ОП, опубликованный в ответ на его собственный вопрос, но он изменен, чтобы его можно было компилировать напрямую, когда вы копируете его из stackexchange, его код не мог напрямую компилироваться.
Этот код скомпилирован, и я добавил несколько дополнительных функций.
Инструкции: Запустите любую программу, затем выполните команду «ps aux | имя программы, чтобы получить свой pid. Это второй столбец слева. Теперь введите это число в pid главной функции и скомпилируйте программу. Теперь при запуске программы вывод будет примерно таким:
Просрочено: дней: 0, часов: 0, мин: 5, секунд: 58
//Original code credit by kmdent.
///4692042/kak-vy-poluchaete-kak-dolgo-protsess-zapuschen
#include <iostream>
#include <iterator>
#include <sstream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cerrno>
#include <ctime>
#include <cstdio>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>
#include "/usr/include/x86_64-linux-gnu/sys/param.h"
using namespace std;
template <class T>
inline std::string to_string (const T& t)
{
std::stringstream ss;
ss << t;
return ss.str();
}
//Return the number of seconds a process has been running.
long lapsed(string pid) {
int fd;
char buff[128];
char *p;
unsigned long uptime;
struct timeval tv;
static time_t boottime;
if ((fd = open("/proc/uptime", 0)) != -1) {
if (read(fd, buff, sizeof(buff)) > 0) {
uptime = strtoul(buff, &p, 10);
gettimeofday(&tv, 0);
boottime = tv.tv_sec - uptime;
}
close(fd);
}
ifstream procFile;
string f = "/proc/"+pid+"/stat";
procFile.open(f.c_str());
char str[255];
procFile.getline(str, 255); // delim defaults to '\n'
vector<string> tmp;
istringstream iss(str);
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter<vector<string> >(tmp));
std::time_t now = std::time(0);
std::time_t lapsed = ((now - boottime) - (atof(tmp.at(21).c_str()))/HZ);
return lapsed;
}
string human_readable_lapsed(long input_seconds) {
//Credit: http://www.cplusplus.com/forum/beginner/14357/
long days = input_seconds / 60 / 60 / 24;
int hours = (input_seconds / 60 / 60) % 24;
int minutes = (input_seconds / 60) % 60;
int seconds = input_seconds % 60;
return "days: " + to_string(days) + " , hours: " + to_string(hours) + " , min: " + to_string(minutes) + " , seconds: " + to_string(seconds);
}
int main(int argc, char* argv[])
{
//Pid to get total running time for.
string pid = "13875";
std::cout << "Lapsed: " << human_readable_lapsed(lapsed(pid)) << std::endl;
return 0;
}