/ / Truncate файл впливає на процес читання - c, linux

Обрізаний файл впливає на процес читання - c, linux

Нещодавно я читаю UNIX SystemsПрограмування та виконання деяких тестів. Я заплутався в тому, чому я вирізаю файл з командою truncate на терміналі, тоді процес читання читає таку ж позицію повернення 0, яка повертає раніше рядок a. Процес відкриває файл, він буде кешувати файл, beacase i змінити вміст файлу, а потім читати, результат не змінюється, то чому коректний файл негайно вплине на процес? У програмуванні систем UNIX він говорить, що v-вузол включає поточний розмір файлу, тому розмір не повинен бути читати з диска кожен раз, він кешовано в пам'яті.

код джерела коду процесу.

#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 має тільки один символ:

a

Відповіді:

2 для відповіді № 1

Кешування звичайно призначено для підвищення продуктивності, без будь-яких інших виявлених ефектів.

Якщо inode був кешований за процедурою, як ви описали, модифікації, зроблені іншим процесом, можуть не бути видимими в процесах, у яких було збережено кешувати інформацію. Це було б погано.

Насправді, блоки дисків кешуються, індоди єкешування, різні інші структури можуть бути кешовані, але в кожному випадку в ядрі є єдиний кеш, який поділяють всі процеси, тому всі вони мають стійкий вигляд.

Коли один процес усуває файл, кеш в пам'яті оновлюється, зберігаючи новий розмір файлу (який в кінцевому підсумку буде записаний на диск, але, можливо, не відразу). Коли викликається інший процес read Знову ж таки, оновлений розмір файлу читається з кеша в пам'яті, а не з диска.