Да, но ни одному из них не удастся произвести достаточно читаемый код для стоящего усилия. Вы проведете больше времени, пытаясь считать декомпилируемый источник с ассемблерными блоками внутри, чем перезапись Вашего старого приложения с нуля.
Это не имеет значения, нет. Однако могут возникнуть проблемы с кэшированием / буферизацией, что означает, что на самом деле лучше (безопаснее всего) делать то, что вы делаете, и каждый раз открывать файл заново. Поскольку вы делаете это очень редко, от этого не добьетесь производительности, поэтому я бы рекомендовал сохранить ваше текущее решение.
Вам нужно небуферизованное чтение. Предполагая, что вы не можете просто переключиться на вызовы read (), открыть устройство и затем установить поток в небуферизованный режим. Это дает дополнительное преимущество в том, что нет необходимости закрывать поток, когда вы закончите. Просто перемотайте его и начните читать снова.
FILE *f = fopen("/proc/net/dev", "r");
setvbuf(f, NULL, _IONBF, 0);
while (running)
{
rewind(f);
...do your reading...
}