6

/procディレクトリからこの情報を取得する方法はありますか? 各プロセスが秒単位で実行されている時間を取得できるようにしたい。

編集: C++ からこれを行う必要がありました。混乱させて申し訳ありません。

4

6 に答える 6

8

さて、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;

ハッピーコーディング!

于 2011-07-01T21:37:42.490 に答える
3

stat /proc/{processid}シェルで作成時間を確認するために行うことができます。

編集:そのフォルダのfstatは、必要なもの(作成時間)を提供するはずです。

于 2011-06-29T00:03:10.787 に答える
1

あなたがやろうとしていることを分解しましょう:

  1. ファイルが変更された時刻を取得します。
  2. 時間を Unix 時間に変換します。
  3. 2回引きます。

したがって、現在の時刻を取得するには、次を実行できます。

#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);

ええ、それはほとんどそれです。一方から他方への入力を取得するには、パイプが必要です。

于 2011-06-29T00:26:46.733 に答える
0

/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.

...

于 2011-07-02T05:53:03.443 に答える
0

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 )プログラムからコマンドを実行するために呼び出すことができます。

于 2011-06-29T00:09:14.560 に答える