1) Как только родитель разветвляет новый процесс, у нового процесса есть жизнь, и там у него есть свои собственные данные. Новый процесс наследует данные от родителя, и собственная копия Child создается, пока child пытается изменить данные. Этот концентрат называется CopyOnRight. Вот почему изменения, сделанные ребенком, не видны родителем. Даже если вы создаете элемент данных кучи [т.е. динамическое выделение памяти], применима та же концепция. Давайте возьмем следующий пример.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int arg, char ** argv )
{
pid_t pid;
int *p = malloc (sizeof(int));
printf ("\n Globally Assigned 99 to *p\n ");
*p= 99;
pid = fork ();
if (pid > 0)
{
printf ("\n Parent Changed *p to 100 \n ");
*p=100;
wait (NULL);
printf (" Prent Exiting..\n");
} else {
sleep(10); /* I want to give preference to my parent :) */
printf ("..Child fetching the value *p is %d \n", *p);
}
}
2). Как объяснил @Mathieu, труба также может использоваться для связи между двумя процессами.
Давайте посмотрим на следующий пример кода, который использует общую память между родителем и ребенком.
Сравните это с программой, приведенной в (1). Увидеть!!! Я не проверял ошибок, так как намерен спроектировать концепцию !!!.
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main ( int arg, char ** argv )
{
int sId;
int * ptr= NULL;
pid_t pid;
/* We create a shared memory object */
sId = shm_open("MySharedData", O_RDWR|O_CREAT|O_TRUNC, 0666);
/* We allocate memory to shared object */
ftruncate (sId, 512);
/* we attach the allocated object to our process */
ptr = (int *) mmap (NULL, 512, PROT_READ|PROT_WRITE, MAP_SHARED, sId, 0);
printf ("\n Globally Assigned 99 to *p\n ");
*ptr=99;
pid = fork ();
if (pid > 0)
{
printf ("\n Parent Changed *p to 100 \n ");
*ptr=100;
wait (NULL);
printf (" Wow Child canged to %d \n", *ptr);
printf (" Prent Exiting..\n");
} else {
sleep(10); /* I want to give preference to my parent :) */
printf ("..Child fetching the value *p is %d \n", *ptr);
*ptr=1234;
}
}
В программе (2) вы можете видеть изменения в родительском элементе, который был изменен дочерним элементом, и наоборот, поскольку разделяемая память является общей памятью, общей для обоих родителей / дочерних элементов, а не для обеих областей памяти.
Надеюсь, это поможет !!!.