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.