如何使用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