Search code examples
cunixpidprocstat

Read proc stat information


Hello I require following information about process with some PID:

name, ppid, state, #ofOpenFiles, #ofThreads

I know the example of /proc/pid/stat file is like :

15 (watchdog/1) S 2 0 0 0 -1 69239104 0 0 0 0 0 69 0 0 -100 0 1 0 6 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 99 1 0 0 0 0 0 0 0 0 0 0 0

My current attempt of parsing such file:

FILE *fp;
           char buff[255];
           fp= fopen("/proc/123/stat", "r");
           if(fp == NULL){

           }else{

             fscanf(fp, "%d %s %c %d %d %d %d %d %u %lu ....", &pid, &name, &ppid......)
             fclose(fp);
           }

I don't find this very good method. How to do this?


Solution

  • The solution you describe looks good (especially using @kaylum's idea of * format specifier). Note that you can use the same variable several times to ignore parameters:

    fscanf(fp, "%d %s %c %d %d %d %d %d %u %lu ...", &pid, &name, &ppid, &dummy, &dummy, &dummy, ...);
    

    You can also look into strtok to read each line "token" by token. You can use it to create a function returning an array of char* like in this other question and get the i-th element (with all proper NULL and size checks).

    Edit: If the file name contains spaces then you'll have to either use a regex or parse the string manually with e.g. strtok() to detect the proper format.