Я не знаю, почему системный вызов записи, похоже, не задерживается

#c #linux #unix

Вопрос:

 int main(){    
    int fd = open("aaaaaa.txt", O_CREAT | O_RDWR, 0666);
    
    write(fd, "a", 1);

    system("more aaaaaa.txt");

    unlink("aaaaaa.txt");
    close(fd);
    return 0;
}
 

Я хочу спросить, почему эти данные записываются в файл немедленно(по «подробнее» я это вижу), вместо того, чтобы напрямую записываться в кэш страниц ядра(на самом деле не записываются в файл), а через некоторое время кэш страниц действительно записывается в файл потоком flusher .

Комментарии:

1. На чем вы основываете свои выводы?

2. write записывает в «файл». more читает из «файла». Чем бы ни был «файл», кэш страниц, магические вариации на диске или символы, вырезанные в камне, с точки зрения программы на языке си, это всего лишь незначительная деталь реализации.

3. Обратите внимание, что такое поведение требуется стандартом POSIX: любая операция, которая доказуемо выполняется после write() вызова, должна отображать новые данные. Здесь выполнение more , безусловно, происходит после write() , потому system("more") что происходит после write() в вашей программе. Поэтому, если в системе будет кэш страниц, он должен быть согласованным, и все программы должны считываться из него, а не непосредственно с диска.

Ответ №1:

Он записывается в кэш страниц ядра. И more считывает данные из кэша страниц ядра. Кэш страниц ядра является общим для всех процессов, поскольку он находится в ядре.