обновить буфер потока во время чтения / proc - PullRequest
5 голосов
/ 21 января 2011

Я читаю из / proc / pid / task / stat, чтобы отслеживать использование процессора в потоке. откройте / proc / pic / task / stat найти строку из потока sscanf на строку

У меня проблемы с получением буфера потоков для обновления. Если я fget 1024 символа, если обновляется, но если я fget 128 символов, то он никогда не обновляется, и я всегда получаю ту же статистику Я перематываю поток перед чтением и пробовал fsync.

Я делаю это очень часто, поэтому я бы предпочел не открывать файл каждый раз. Как правильно это сделать?

1 Ответ

4 голосов
/ 21 января 2011

Не каждая программа выигрывает от использования буферизованного ввода-вывода.

В вашем случае, я думаю, я бы просто использовал read(2) 1 . Таким образом, вы:

  • устранение всех устаревших буферов 2 проблем
  • вероятно, работать быстрее благодаря устранению двойной буферизации
  • вероятно, использовать меньше памяти
  • определенно упростит реализацию

В случае, подобном описанному вами, прирост эффективности может не иметь значения для современных удивительно мощных процессоров. Но я укажу, что такие программы, как cp(2) и другие высокопроизводительные движки данных, не используют буферизованные пакеты ввода / вывода.


1. То есть open(2), read(2), lseek(2) и close(2).
2. И, возможно, чтобы перехватить аргумент, по вопросам, связанным с этим, кто-то обычно предлагает «полезное» предложение по линии fflush(stdin), а затем приходит другой, чтобы точно указать, что fflush() определяется C99 на только выходные потоки, и что обычно неразумно зависеть от поведения конкретной реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...