ďťż
 
 
   [C] fork
 
 

Tematy

 
    
 

 

 

 

[C] fork





qwertyyu - 16-01-2008 10:06
Witam, mam pytanie: czy fork ma dostep do zmiennych procesu macierzystego?
Jesli nie ma, to jak wyglada rozwiazanie przy pomocy pamieci wspoldzielonej?
Mile widziany fragment kodu dla przykladu, jak ta pamiec ustawic, cos w nia wrzucc i podlaczyc sie do niej z forka.



AdeBe - 16-01-2008 10:53
Procesy potomne nie mają dostępu do pamieci procesu macierzystego. Ale kopiowanie zmiennych odbywa sie dopiero przy zapisie. Fork dziedziczy jednak np. deskryptory otwartych plików. Jesli musisz intensywnie korzystac z pamieci procesu macierzystego to moze lepiej uzyj w swoim programie watkow?



qwertyyu - 16-01-2008 11:41
Ale niestety takie jest wymaganie, wiec musze skorzystac z pamieci wspoldzielonej...
Wiem juz jak ja stworzyc i sie do niej dolaczyc, bede wdzieczny za krotki przyklad w jaki sposob umiescic w niej jakas strukture z procesu macierzystego i odwolac sie do tej struktury z procesu potomnego.



Avilar - 16-01-2008 22:57
10 struct komunikat{
 11        long type;
 12        int value;
 13 };
 14
 15 int main(){
 16
 17        key_t shmkey , semkey;
 18        int shmid , semid;
 19        struct komunikat *mem , *ptr;
 20        struct sembuf op;
 21
 22        if((shmkey=ftok("plik" , 128))==-1){
 23                perror("ftok1");
 24                exit(-1);
 25        }
 26
 27        if((semkey=ftok("plik" , 64))==-1){
 28                perror("ftok2");
 29                exit(-1);
 30        }
 31
 32        if((shmid=shmget(shmkey , 1024 , IPC_CREAT|IPC_EXCL|0666))==-1){
 33                perror("shmget");
 34                exit(-1);
 35        }
 36        printf("shmid: %d\n" , shmid);
 37
 38        mem = shmat(shmid , 0 , 0);
 39                if(mem==NULL){
 40                        perror("shmat");
 41                        exit(-1);
 42                }
 43
 44                ptr=mem;
 45
 46                mem->type=666;
 47                mem->value=6;
 48
 49                ptr+=sizeof(mem);
 50
 51                ptr->type=777;
 52                ptr->value=7;
 53
 54                sleep(10);
 55
 56        if(shmdt(mem)==-1){
 57                perror("shmdt");
 58                exit(-1);
 59        }
 60
 61        if(shmctl(shmid , IPC_RMID , NULL)==-1){
 62                perror("shmctl");
 63                exit(-1);
 64        }
 65
 66 return 0;
 67 } To co zwraca funkcja shmat() to wskaźnik do segmentu pamięci wspólnej. Możesz sobie tam buszować ile dusza zapragnie. Jeśli utworzysz w odpowiednim miejscu proces potomny to odziedziczy on wskaźnik do pamięci dzielonej i będziesz mógł współdzielić dane. Oczywiście żeby uniknąć race condition musisz użyć semaforów. W tym przykładzie użyłem pamięci wspólnej w standardzie systemu piątego.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • minister.pev.pl

  •  

     


     

     
    Copyright 2003. MĂłj serwis