c - start time of a process on linux -
how find process start time on ubuntu linux machine using c language. in linux there /proc/[pid]/stat file give information
starttime %lu /*the time in jiffies process started after system boot*/
, file /proc/stat gives
btime %lu /*measurement of system boot time since epoch in seconds*/
for adding both these values how can convert former value seconds because in jiffies unit.
jiffies per second configurable when 1 compiles linux kernel.
the following program uses number of jiffies per second on kernel you're running. takes optional command line parameter, process number. default process number of running program itself. each second, outputs start time of specified process, both local time , utc. reason repeat loop demonstrate 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 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 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 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() */
Comments
Post a Comment