C статические переменные и вилка linux

Привет я создал серверную программу, которая развивает новый процесс после того, как он принимает соединение сокета. В программе определено несколько статически распределенных глобальных переменных. Мой вопрос в том, выделяются ли эти статические буферы дважды после вилки? Или вилка только дублирует адресное пространство в куче и стеке вызовов?

4 ответов


на всего адресное пространство дублируется, включая все глобальные переменные и текст программы.


все адресное пространство "дублируется" во время fork(2). Это часто делается с копирование при записи и есть более подробная информация о совместном использовании текста программы и библиотек, но это не имеет отношения здесь. Как родительские, так и дочерние процессы получают собственную копию статических данных.


fork() дублирует весь образ процесса. Все это. Таким образом, они выделяются дважды... нет, они выделяются один раз на исполняемый образ, которых теперь два, и нет, если вы ссылаетесь на один в родителе, он не будет содержать тот же контент, что и у ребенка, если вы не используете общую память.

On static, Это ключевое слово означает следующее (из ISO C99):

объект, идентификатор которого объявлена с внешней или внутренней связью, или с спецификатор класса памяти static имеет статическую длительность хранения. Его жизнь - это все исполнение программы и ее сохраненное значение инициализируется только один раз, до запуск программы.

что в основном означает, что ваш буфер будет инициализирован один раз как часть процедуры запуска CRT, и это пространство исчезнет только при выходе. В этом случае хранилище исчезает при выходе каждого ребенка.


Linux использует механизм, называемый copy-on-write. Это в основном означает,что пока переменная не изменена родителем, а новый процесс использует одну переменную. Но перед изменением переменной она копируется, и новый процесс использует copy. Это делается по соображениям производительности, а техника называется ленивой оптимизацией. Поэтому вы не должны беспокоиться о том, что изменение переменной в одном процессе изменит ее в другом.