время начала процесса в Linux - PullRequest
4 голосов
/ 29 апреля 2011

Как найти время запуска процесса на машине с Ubuntu Linux, используя язык c. В Linux есть файл / proc / [pid] / stat, который предоставляет информацию

starttime %lu /*The time in jiffies the process started after system boot*/
и файл / proc / stat, который дает

btime %lu /*measurement of system boot time since Epoch in seconds*/  

Для добавления обоих этих значений, как я могу преобразовать предыдущее значение в секунды, потому что оно в единицах jiffies.

1 Ответ

4 голосов
/ 29 апреля 2011

Jiffies в секунду настраивается при компиляции ядра Linux.

Следующая программа использует количество jiffies в секунду на ядре, которое вы используете.Он принимает необязательный параметр командной строки, который является номером процесса.По умолчанию используется номер процесса самой работающей программы.Каждую секунду он выводит время начала указанного процесса, как в местном времени, так и в формате UTC.Единственная причина повторения цикла - показать, что значение не меняется.

#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
int
find_nth_space(char *search_buffer,
               int   space_ordinality
              )
{
  int jndex;
  int space_count;

  space_count=0;

  for(jndex=0;
      search_buffer[jndex];
      jndex++
     )
  {
    if(search_buffer[jndex]==' ')
    {
      space_count++;

      if(space_count>=space_ordinality)
      {
        return jndex;
      }
    }
  }

  fprintf(stderr,"looking for too many spaces\n");

  exit(1);

} /* find_nth_space() */

int
main(int    argc,
     char **argv
    )
{
  int       field_begin;
  int       stat_fd;

  char      proc_buf[80];
  char      stat_buf[2048];

  long      jiffies_per_second;

  long long boot_time_since_epoch;
  long long process_start_time_since_boot;

  time_t    process_start_time_since_epoch;

  ssize_t   read_result;

  struct tm gm_buf;
  struct tm local_buf;

  jiffies_per_second=sysconf(_SC_CLK_TCK);

  if(argc<2)
  {
    strcpy(proc_buf,"/proc/self/stat");
  }
  else
  {
    sprintf(proc_buf,"/proc/%ld/stat",strtol(argv[1],NULL,0));
  }

  for(;;)
  {
    stat_fd=open(proc_buf,O_RDONLY);

    if(stat_fd<0)
    {
      fprintf(stderr,"open() fail\n");

      exit(1);
    }

    read_result=read(stat_fd,stat_buf,sizeof(stat_buf));

    if(read_result<0)
    {
      fprintf(stderr,"read() fail\n");

      exit(1);
    }

    if(read_result>=sizeof(stat_buf))
    {
      fprintf(stderr,"stat_buf is too small\n");

      exit(1);
    }

    field_begin=find_nth_space(stat_buf,21)+1;

    stat_buf[find_nth_space(stat_buf,22)]=0;

    sscanf(stat_buf+field_begin,"%llu",&process_start_time_since_boot);

    close(stat_fd);

    stat_fd=open("/proc/stat",O_RDONLY);

    if(stat_fd<0)
    {
      fprintf(stderr,"open() fail\n");

      exit(1);
    }

    read_result=read(stat_fd,stat_buf,sizeof(stat_buf));

    if(read_result<0)
    {
      fprintf(stderr,"read() fail\n");

      exit(1);
    }

    if(read_result>=sizeof(stat_buf))
    {
      fprintf(stderr,"stat_buf is too small\n");

      exit(1);
    }

    close(stat_fd);

    field_begin=strstr(stat_buf,"btime ")-stat_buf+6;

    sscanf(stat_buf+field_begin,"%llu",&boot_time_since_epoch);

    process_start_time_since_epoch
    =
    boot_time_since_epoch+process_start_time_since_boot/jiffies_per_second;

    localtime_r(&process_start_time_since_epoch,&local_buf);
    gmtime_r   (&process_start_time_since_epoch,&gm_buf   );

    printf("local time: %02d:%02d:%02d\n",
           local_buf.tm_hour,
           local_buf.tm_min,
           local_buf.tm_sec
          );

    printf("UTC:        %02d:%02d:%02d\n",
           gm_buf.tm_hour,
           gm_buf.tm_min,
           gm_buf.tm_sec
          );

    sleep(1);
  }

  return 0;
} /* main() */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...