/ / Truncate plik wpływa na proces odczytu - c, linux

Skasowany plik wpływa na proces odczytu - c, linux

Ostatnio czytam systemy UNIXProgramowanie i wykonanie testu. Jestem zdezorientowany, dlaczego skracam plik za pomocą polecenia truncate w terminalu, a następnie proces odczytu odczytuje tę samą pozycję return 0, która zwraca ciąg "a" wcześniej.Proces otwiera plik, będzie buforował plik, beacase i zmienić zawartość pliku, a następnie przeczytać, wynik jest taki sam, nie zmieniony, więc dlaczego truncate plik będzie miał wpływ na proces natychmiast? W UNIX Systems Programowanie mówi, że v węzeł obejmuje bieżący rozmiar pliku? tak rozmiar nie jest czytane z dysku za każdym razem, jest buforowane w pamięci.

źródło kodu procesu odczytu.

#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
int fd = open("a.txt", O_RDONLY);
char buf[1024];
int n;
for(int i = 0;i < 10; i++){
if (lseek(fd, 0, 0) == -1){
return 1;
}
n = read(fd, buf, 1);
if (n < 0){
perror("error");
return 1;
}
printf("%dn", n);
buf[n]=0;
printf("buf %sn", buf);
sleep(2);
}
return 0;
}

a.txt ma tylko jeden znak:

a

Odpowiedzi:

2 dla odpowiedzi № 1

Buforowanie zwykle ma na celu poprawę wydajności, bez żadnych innych wykrywalnych efektów.

Jeśli i-węzeł był buforowany w procesie, jak opisałeś, modyfikacje dokonane przez inny proces mogły nie być widoczne w procesach, które zawierały informacje buforowane. To byłoby złe.

W rzeczywistości bloki dysków są buforowane, a także i-węzłybuforowane, różne inne struktury mogą być buforowane, ale w każdym przypadku istnieje pojedyncza pamięć podręczna, w jądrze, którą wszystkie procesy dzielą, więc wszystkie mają spójny widok.

Gdy jeden proces obcina plik, pamięć podręczna w pamięci jest aktualizowana, zachowując nowy rozmiar pliku (który zostanie ostatecznie zapisany na dysku, ale prawdopodobnie nie od razu). Gdy drugi proces wywoła read ponownie, zaktualizowany rozmiar pliku jest odczytywany z pamięci podręcznej w pamięci, a nie z dysku.