Подтвердить что ты не робот

После форкирования общие глобальные переменные?

Рассмотрим этот простой код:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

Когда ребенок увеличивает myvar, это значение, которое делится с отцом (например, pthread)?

4b9b3361

Ответ 1

Нет и да.

Нет, они не разделяются каким-либо образом, что видно программисту; процессы могут самостоятельно изменять свои собственные копии переменных, и они будут меняться без какого-либо заметного влияния на другие процессы, которые являются родителями fork(), братьями и сестрами или потомками.

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

Если вы хотите иметь общие переменные, поместите их в анонимное общее сопоставление (см. mmap()), и в этом случае они действительно получат общий доступ со всеми оговорками, которые приходят с этим.

Ответ 2

fork() ing создает точную копию родительского процесса во время разветвления. Однако после завершения fork() у ребенка будет совершенно другое существование и он не будет возвращать родительскому объекту.

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

Ответ 3

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

Ответ 4

Нет, поскольку глобальные переменные не разделяются между процессами, если не выполняется какой-либо механизм МПК. Объем памяти будет скопирован. Как следствие, глобальная переменная в обоих процессах будет иметь одно и то же значение сразу после fork, но если кто-то ее изменит, другой не увидит, что она изменилась.

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