在Linux上启动一个进程的时间 [英] start time of a process on linux
问题描述
如何寻找用c语言Ubuntu Linux操作系统的计算机上的进程开始时间。在linux下有这给信息的/ proc / [PID] / STAT文件
How to find a process start time on ubuntu linux machine using c language. In linux there is /proc/[pid]/stat file which give information
开始时间为%lu / *一会儿的时间过程中系统启动后启动* /
结果
这给了文件/ proc / STAT
starttime %lu /*The time in jiffies the process started after system boot*/
and file /proc/stat that gives
btime %lu /*measurement of system boot time since Epoch in seconds*/
有关添加这两个值我如何转换前值到秒,因为它是一会儿的单位。
For adding both these values how can I convert former value into seconds because it is in jiffies unit.
推荐答案
每秒的jiffies是可配置的,当一个编译Linux内核。
Jiffies per second is configurable when one compiles the Linux kernel.
下面的程序使用您所运行的内核每秒的jiffies数量。它带有一个可选的命令行参数,这是进程号。默认值是正在运行的程序本身的进程号。每个第二,它输出指定过程的开始时间,既作为本地时间与UTC。用于重复循环的唯一原因是要证明的值不发生变化。
The following program uses the number of jiffies per second on the kernel you're running. It takes an optional command line parameter, which is the process number. The default is the process number of the running program itself. Each second, it outputs the start time of the specified process, both as local time and UTC. The only reason for the repeat loop is to demonstrate that the value doesn't change.
#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() */
这篇关于在Linux上启动一个进程的时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!