当前位置: 首页 > 面试题库 >

Linux上进程的开始时间

田嘉澍
2023-03-14
问题内容

如何使用C语言在ubuntu linux机器上查找进程开始时间。在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为单位。


问题答案:

当人们编译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() */


 类似资料:
  • 问题内容: 是否可以获取旧的运行过程的开始时间?如果今天不是开始日期,似乎会报告日期(而不是时间),如果今年不是开始日期,则只会报告日期。旧工艺会永远失去精度吗? 问题答案: 您可以指定格式器并使用,例如以下命令: 上面的命令将输出所有进程,并带有格式化程序以获取PID,命令运行以及启动日期和时间。 示例(从Debian / Jessie命令行) 您可以阅读的联机帮助页或查看Opengroup的其

  • 问题内容: 我决定不安装Windows,现在将Debian作为默认操作系统运行。我一直在Windows中编写代码,尤其是在Visual Studio中编写代码。我目前正试图习惯于在Linux下编译我的代码。 尽管我仍然有很多文档需要阅读,并且不要期望你们对我来说太容易了,但仍然可以从入门那里获得一些指导。我有一些特定的问题,但随时可以提出/建议有关此主题的其他任何内容。 关于创建make文件的推荐

  • 本文向大家介绍计算Linux上进程中的线程数,包括了计算Linux上进程中的线程数的使用技巧和注意事项,需要的朋友参考一下 Linux进程可以可视化为程序的运行实例,其中Linux中的每个线程不过是进程的执行流。您知道如何在Linux环境中查看每个进程的线程数吗?有几种计数线程数的方法。本文讨论如何读取有关Linux上进程的信息以及如何计算每个进程的线程数。 阅读过程信息 要读取过程信息,请使用“

  • 问题内容: 对于使用g ++和gdb的入门,是否有很好的“使用方法”或“入门”指南? 一些背景。体面的程序员,但到目前为止,我已经在Windows中的Visual Studio中完成了所有工作。 我对使用终端来编译文件有一点经验(除了.h和1或2 .cpp以外)。但是除此之外。 任何人都知道如何开始在Linux上编码的好入门? 问题答案: 阅读一些好书,特别是Advanced Linux Prog

  • 问题内容: 我是Linux的新手,使用Windows OS已有10年了,并且使用Microsoft语言进行开发。 我想在Linux领域有很好的经验,并以此为基础进行开发。 首先,我想学习如何使用这个新的OS,然后如何开始对其进行开发,我对Web应用程序特别是Java / PHP感兴趣,因为我在这两个方面都有一定的经验,这将是一个好的开始。 第二,我想学习如何在此基础上发展。 有视频教程可以给我一个

  • 问题内容: 如何在Linux中搜索进程的内存状态?具体来说,我希望确定某些感兴趣的区域,并定期查看它们,有时可能会拨出新的价值。 我怀疑答案可能涉及对ptrace()的调用,并读取/ proc / [pid] / mem ,但是还需要继续。 问题答案: 我已经为所需的功能开发了一些代码。 memutil模块提供了进程内存区域迭代,并在ptrace模块和readmem可执行文件的帮助下读取pytho