Атрибуты файла хранятся в структуре данных inode, которая связана с номером inode, например, разрешение, размер, uid, gid (по ls -l
и lsattr
). имя файла не хранится в структуре данных inode.
оно хранится в файле каталога, который связан с номером inode.
[luchaoqun @ centos-7 ~] $ ls -i www
1704095 overflow_1 8722125 overflow_2
Если для каталога установлены права r
и x
, вы можете увидеть имя файла и информацию об индексе (по команда ls -i
). если есть разрешение r
, а не разрешение x
, вы можете видеть только имя файла и не можете видеть информацию об индексных дескрипторах в каталоге.
[lu @ centos-7 www] $ ls -l
всего 8
- rw-r - r -. 1 luchaoqun luchaoqun 0 3 июня 13:19 overflow_1
- rw-r - r--. 1 luchaoqun luchaoqun 0 3 июня 13:19 overflow_2
[lu @ centos-7 ~] $ chmod ux
[lu @ centos-7 ~] $ ls -ld www
drw-r-xr-x. 2 luchaoqun luchaoqun 40 3 июня 13:19 www
[lu @ centos-7 ~] $ ls -l www
ls: нет доступа к www / overflow_1: в доступе отказано
ls: нет доступа к www / overflow_2: в доступе отказано
всего 0
?????????? ? ? ? ? ? overflow_1
?????????? ? ? ? ? ? переполнение_2
Когда выполняется дочерний процесс, все его текущие страницы заменяются совершенно новым набором страниц, соответствующим новому исполняемому образу (плюс куча, стек и т. д. ).
Современные ОС реализуют CoW is, поддерживая счетчик ссылок для физических страниц, совместно используемых родительским и дочерним процессами. Если страница совместно используется родителем и потомком, счетчик ссылок будет равен 2. Как только дочерний процесс проходит через exec, счетчик ссылок для общих страниц уменьшается (, например, он возвращается к 1 ), поэтому любая операция записи родительским процессом будет успешным без CoW.
Для вашего развлечения создайте простую программу, которая выполняет fork, после чего дочерний процесс засыпает на несколько секунд, а затем выполняет и выполняет. Теперь обратите внимание на содержимое /proc/PID/smaps
обоих процессов перед fork (only parent of course ), после fork, но перед exec, и после exec. Обратите внимание на страницы Shared _XXX и соответствующие диапазоны адресов.
Что касается кода, существует несколько простых расширений XV6 для поддержки копирования -на запись -. Простого поиска в Google может быть достаточно. Другим местом, на которое стоит обратить внимание, может бытьhttps://github.com/torvalds/linux/blob/master/kernel/fork.c. Начните отслеживать его с входа в развилку и получайте удовольствие.
Fork is rather simple, once you get the hang of it, but the memory management can be a bitch. See 'mm/memory.c': 'copy_page_range()'