Псевдофайлы в "/ proc" опасны для демонов, потому что если ядро решит их отбросить, они просто исчезнут, оставив вас с неверной структурой FILE *
. Это означает, что ваша стратегия является единственно верной для обработки файла в "/ proc" (но никто не будет ожидать, что "/ proc / net / dev" будет удален ядром во время выполнения).
Обычно (особенно для файлов в "/ proc / [PID]") следует открывать файлы в / proc перед операцией и закрывать их как можно скорее после выполнения операции.
См. Этот пример кода. Он разветвляет и читает файл «/ proc / [PID] / status» ребенка, один раз до выхода ребенка и один раз во время очистки ребенка.
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char** argv){
pid_t child=fork();
if(child==0){
sleep(1);
} else {
char path[256],buffer[256]; int status,read_length;
sprintf(path,"/proc/%i/status",child);
//do a read while the child is alive
FILE *fd=fopen(path,"r");
if(fd!=0){
read_length=fread(buffer,1,255,fd);
printf("Read: %i\n",read_length);
fclose(fd);
}
//repeat it while the child is cleaned up
fd=fopen(path,"r");
wait(&status);
if(fd!=0){
read_length=fread(buffer,128,1,fd);
printf("Read: %i\n",read_length);
fclose(fd);
}
}
}
Результат выглядит следующим образом
f5:~/tmp # ./a.out
Read: 255
Read: 0
Итак, вы видите, вы можете легко получить неожиданный результат из файлов в "/ proc", если они будут удалены ядром во время выполнения вашей программы.