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?
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.