[C] fork

Potrzebujesz pomocy z C, C++, perl, python, itp.
qwertyyu
Posty: 7
Rejestracja: 14 stycznia 2008, 21:54

[C] fork

Post autor: qwertyyu »

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
Junior Member
Posty: 825
Rejestracja: 01 grudnia 2007, 14:41

Post autor: AdeBe »

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
Posty: 7
Rejestracja: 14 stycznia 2008, 21:54

Post autor: qwertyyu »

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
Posty: 6
Rejestracja: 13 stycznia 2008, 20:26
Lokalizacja: Toruñ

Post autor: Avilar »

Kod: Zaznacz cały

 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.
ODPOWIEDZ