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
starttime %lu /*The time in jiffies the process started after system boot*/
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 per second is configurable when one compiles the Linux kernel.
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() */
精彩评论