(Ubuntu) C Вычисление загрузки ЦП с использованием /proc/stat

#c #cpu-usage

#c #загрузка ЦП

Вопрос:

Я пытаюсь написать программу на C, которая будет считывать данные из /proc / stat, подождите секунду, затем снова считайте из / proc / stat секунду спустя, затем выполните некоторые вычисления, чтобы найти «текущее» использование ЦП, а также использование для каждого ядра. Я думаю, что самый простой способ сделать это — сохранить результаты /proc/stat в файл, а также второй файл для второго «состояния» /proc/stat. Затем я бы прочитал из него и вычислил оттуда. Однако по какой-то причине я понятия не имею, почему ни один из моих файлов не создается.

 int main() {
    FILE *state0;
    FILE *state1;
    state0 = fopen("/proc/stat", "w ");
    delay();
    state1 = fopen("/proc/stat", "w ");

    char *con0 = malloc(500);
    fprintf(state0, con0);

    fclose(state0);
    fclose(state1);

    return 0;
}
 

И помощь очень ценится

Комментарии:

1. Вы всегда можете просто frewind обычно. Данные генерируются во время чтения , поэтому вы должны прочитать заранее, а затем подождать.

2. "w " режим «добавить», который не имеет смысла для этого. Вы хотите "r" .

Ответ №1:

Проблема в том, что при попытке сохранить файл с помощью вызова:

 fprintf(state0, con0);
 

Вы пытаетесь записать память , выделенную в con0 to state0 , которая является указателем на /proc/stat .

Это, конечно, терпит неудачу, потому что у вас нет прав на запись /proc/stat , а этого делать не следует.

Чтобы открыть эти файлы для чтения, как упоминал Тадман, вы хотите открыть файлы в "r" режиме:

 FILE *state0;
FILE *state1;
state0 = fopen("/proc/stat", "r");
delay();
state1 = fopen("/proc/stat", "r");
 

Что вы хотели бы сделать, так это создать отдельный файл, например:

 FILE *newfile;
newfile = fopen("/tmp/procstattemp", "w");
 

и запишите в этот файл, используя:

 fprintf(newfile, con0);
 

Кроме того, вы выделяете память для con0 , но вы ничего не записали в этот буфер.
Если вы хотите сохранить /proc/stat в файл, вам нужно будет прочитать файл и скопировать его, con0 прежде чем записывать свой временный файл.

См . также:

http://www.cplusplus.com/reference/cstdio/fprintf/

http://www.cplusplus.com/reference/cstdio/fopen/