fork
процессы не разделяют память. Каждый процесс после fork
будет функционально содержать копию пространства памяти оригинала (это Копировать при записи, поэтому он будет скопирован при изменении, но они функционально различаются после вилка).
Этот простой пример показывает, как каждый дочерний элемент может видеть глобальный дочерний массив в своем собственном пространстве процессов , начиная с fork()
, но не после этого.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#define MCHILD 3
pid_t children[MCHILD];
void print_children(char* prefix){
for( int i = 0; i < MCHILD; i++){
printf("%s sees child element %i: %d\n", prefix, i, children[i]);
}
}
int main() {
for( int i = 0; i < MCHILD; i++){
pid_t p = fork();
if(p == 0){
printf("Child %d\n", i);
char * prefix;
asprintf(&prefix, "\tChild %d", i);
print_children(prefix);
exit(0);
} else {
children[i] = p;
}
}
print_children("Parent");
}
Вот оно:
$ gcc -o tc t.c && ./tc
Parent sees child element 0: 41188
Parent sees child element 1: 41189
Parent sees child element 2: 41190
Child 0
Child 0 sees child element 0: 0
Child 0 sees child element 1: 0
Child 0 sees child element 2: 0
Child 1
Child 1 sees child element 0: 41188
Child 1 sees child element 1: 0
Child 1 sees child element 2: 0
Child 2
Child 2 sees child element 0: 41188
Child 2 sees child element 1: 41189
Child 2 sees child element 2: 0