Рассмотрим этот простой код:
int myvar = 0;
int main() {
if (fork()>0) {
myvar++;
} else {
// father do nothing
}
}
Когда ребенок увеличивает myvar, это значение, которое делится с отцом (например, pthread)?
Рассмотрим этот простой код:
int myvar = 0;
int main() {
if (fork()>0) {
myvar++;
} else {
// father do nothing
}
}
Когда ребенок увеличивает myvar, это значение, которое делится с отцом (например, pthread)?
Нет и да.
Нет, они не разделяются каким-либо образом, что видно программисту; процессы могут самостоятельно изменять свои собственные копии переменных, и они будут меняться без какого-либо заметного влияния на другие процессы, которые являются родителями fork(), братьями и сестрами или потомками.
Но да, ОС фактически действительно использует страницы на начальном этапе, потому что fork реализует copy-on-write, что означает, что при условии, что ни один из процессов не изменяет страницы, они совместно используются. Это, однако, оптимизация, которую можно игнорировать.
Если вы хотите иметь общие переменные, поместите их в анонимное общее сопоставление (см. mmap()), и в этом случае они действительно получат общий доступ со всеми оговорками, которые приходят с этим.
fork()
ing создает точную копию родительского процесса во время разветвления. Однако после завершения fork()
у ребенка будет совершенно другое существование и он не будет возвращать родительскому объекту.
Другими словами, нет, родительские глобальные переменные не будут изменены изменениями в child.
После fork() весь процесс, включая все глобальные переменные, дублируется. Ребенок является точной копией родителя, за исключением того, что он имеет другой идентификатор (идентификатор процесса), другой родительский элемент и fork(), возвращаемый 0. Глобальные переменные по-прежнему являются глобальными в рамках собственного процесса. Таким образом, ответ отрицательный, глобальные переменные не разделяются между процессами после вызова fork().
Нет, поскольку глобальные переменные не разделяются между процессами, если не выполняется какой-либо механизм МПК. Объем памяти будет скопирован. Как следствие, глобальная переменная в обоих процессах будет иметь одно и то же значение сразу после fork, но если кто-то ее изменит, другой не увидит, что она изменилась.
С другой стороны, потоки разделяют глобальные переменные.