Привет, я создал серверную программу, которая разветвляет новый процесс после того, как он принимает соединение сокета. В программе определено несколько статически выделенных глобальных переменных. Мой вопрос: эти статические буферы выделяются дважды после форка? Или форк дублирует только адресное пространство в куче и стеке вызовов?
Статические переменные C и форк Linux
Ответы (4)
Дублируется все адресное пространство, включая все глобальные переменные и текст программы.
main
. Таким образом, эта память является частью образа процесса, который дублирует fork.
- person ; 02.02.2011
Все адресное пространство "дублируется" во время fork(2)
. Часто это делается с помощью копирования при записи, и есть более подробная информация о совместном использовании текста программы и библиотек, но здесь это не имеет значения. Как родительский, так и дочерний процессы получают свою собственную копию статических данных.
fork()
дублирует весь образ процесса. Все это. Таким образом, они выделяются дважды... нет, они выделяются один раз для каждого исполняемого образа, которых теперь два, и нет, если вы ссылаетесь на один в родительском, он не будет содержать то же содержимое, что и у исполняемого образа. дочерний, если вы не используете общую память.
На static
это ключевое слово означает следующее (из ISO C99):
Объект, идентификатор которого объявлен с внешней или внутренней связью или со спецификатором класса хранения static, имеет статическую продолжительность хранения. Его время жизни равно всему выполнению программы, а его сохраненное значение инициализируется только один раз перед запуском программы.
Это в основном означает, что ваш буфер будет инициализирован один раз как часть процедуры запуска CRT, и это пространство исчезнет только при выходе. В этом случае это хранилище исчезает при выходе каждого дочернего элемента.
Linux использует механизм, называемый копированием при записи. В основном это означает, что пока переменная не изменена, родительский и новый процессы совместно используют одну переменную. Но перед изменением переменной она копируется, и новый процесс использует копию. Это делается из соображений производительности, и этот метод называется ленивой оптимизацией. Так что не стоит переживать, что изменение переменной в одном процессе изменит ее в другом.