Форк () и поведение коровы после exec ()

Атрибуты файла хранятся в структуре данных 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

1
16.09.2018, 09:20
1 ответ

Когда выполняется дочерний процесс, все его текущие страницы заменяются совершенно новым набором страниц, соответствующим новому исполняемому образу (плюс куча, стек и т. д. ).

Современные ОС реализуют 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()'

1
27.01.2020, 23:42

Теги

Похожие вопросы