|
[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.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|