/proc
ディレクトリからこの情報を取得する方法はありますか? 各プロセスが秒単位で実行されている時間を取得できるようにしたい。
編集: C++ からこれを行う必要がありました。混乱させて申し訳ありません。
/proc
ディレクトリからこの情報を取得する方法はありますか? 各プロセスが秒単位で実行されている時間を取得できるようにしたい。
編集: C++ からこれを行う必要がありました。混乱させて申し訳ありません。
さて、top
コマンドのソース コードを読んだ後、プロセスの開始時刻を取得するハックではない方法を見つけました。彼らが使用する式は次のとおりです。
Process_Time = (current_time - boot_time) - (process_start_time)/HZ.
(process_start_time は jiffies であるため、HZ で割る必要があります)
これらの値の取得:
current_time
- C コマンドから取得できますgettimeofday()
。boot_time
- この値は にあり/proc/uptime
ます。このファイルには、システムの稼働時間 (秒) とアイドル プロセスに費やされた時間 (秒) の 2 つの数値が含まれています。最初を取る。process_start_time
- この値は にあり/proc/[PID]/stat
ます。システムの起動時とプロセスの開始時との時間差 (jiffy 単位)。(空白で分割した場合、ファイルの 22 番目の値)。コード (申し訳ありませんが、私は時々 c と c++ を混ぜます):
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;
procFile.open("/proc/[INSERT PID HERE]/stat");
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));
process_time = (now - boottime) - (atof(tmp.at(21).c_str()))/HZ;
ハッピーコーディング!
stat /proc/{processid}
シェルで作成時間を確認するために行うことができます。
編集:そのフォルダのfstatは、必要なもの(作成時間)を提供するはずです。
あなたがやろうとしていることを分解しましょう:
したがって、現在の時刻を取得するには、次を実行できます。
#include <cstdio>
#include <cstdlib>
char *command;
int process_number = 1; // init process.
SYSTEM ("mkfifo time_pipe");
sprintf (command, "stat /proc/%d -printf="%%X" > time_pipe", process_number); // get the command to run.
// since this directory is created once it starts, we know it is the start time (about)
// note the %%, which means to print a literal %
SYSTEM (command); // run the command.
さて、次のステップはそれを Unix 時間に解析することですが、そうする必要はありません! %X 指定子は実際にそれを Unix 時間に変換します。したがって、次のステップは、(a) 現在の時刻を取得する (b) 時刻を減算することです。
timeval cur_time;
double current_time, time_passed;
char read_time[11]; // 32 bit overflows = only 11 digits.
FILE *ourpipe;
gettimeofday(&cur_time, NULL);
current_time = cur_time.tv_sec + (cur_time.tv_usec * 1000000.0);
// usec stands for mu second, i.e., a millionth of a second. I wasn't there when they named this stuff.
ourpipe = fopen ("time_pipe", "rb");
fread(read_time, sizeof (char), 10, ourpipe);
time_passed = current_time - atoi (read_time);
fclose (ourpipe);
ええ、それはほとんどそれです。一方から他方への入力を取得するには、パイプが必要です。
/proc/{processid} # 良いアイデアです!
しかし、なぜ /proc/{processid}/stat を読み取って、必要な統計情報を取得しないのでしょうか?
「man proc」から:
...
stat kernel/system statistics
cpu 3357 0 4313 1362393
The number of jiffies (1/100ths of a second)
that the system spent in user mode, user
mode with low priority (nice), system mode,
and the idle task, respectively. The last
value should be 100 times the second entry
in the uptime pseudo-file.
disk 0 0 0 0
The four disk entries are not implemented at
this time. I'm not even sure what this
should be, since kernel statistics on other
machines usually track both transfer rate
and I/Os per second and this only allows for
one field per drive.
...
time コマンドは、その情報を提供します。
> man 1 time
コマンドライン引数はそれを返します
%S Total number of CPU-seconds that the process spent in kernel mode.
%U Total number of CPU-seconds that the process spent in user mode.
%P Percentage of the CPU that this job got
system( char *command )
プログラムからコマンドを実行するために呼び出すことができます。