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

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -