Strona 1 z 1
					
				[C] fork
				: 16 stycznia 2008, 10:06
				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.
			 
			
					
				
				: 16 stycznia 2008, 10:53
				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?
			 
			
					
				
				: 16 stycznia 2008, 11:41
				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.
			 
			
					
				
				: 16 stycznia 2008, 22:57
				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.