Разделяются ли глобальные переменные? - PullRequest
39 голосов
/ 28 ноября 2010

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

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

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

Ответы [ 4 ]

48 голосов
/ 29 ноября 2010

Нет и да.

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

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

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

36 голосов
/ 28 ноября 2010

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

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

14 голосов
/ 17 августа 2014

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

3 голосов
/ 28 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...