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