sam_on Napisano Listopad 17, 2009 Zgłoszenie Share Napisano Listopad 17, 2009 Witam, Chciałem napisać program realizujący zagadnienie producenta-konsumenta. Naiwnie napisałem coś takiego: #include <stdio.h> #include <stdlib.h> #include <time.h> # define MAKS 10 int bufor[MAKS]; int we = 0, wy = 0; int ile = 0; void produkuj(){ bufor[we] = rand()%100; printf("PROD: %d", bufor[we]); we++; ile++; } void konsumuj(){ printf("KONS: %d", bufor[wy]); wy++; } int main(){ srand(time(NULL)); int pid; pid = fork(); if (pid < 0){ fprintf(stderr, "Aaaaa! fatal error!\n"); exit(-1); } if (pid > 0) { //jestesmy w procesie macierzystym - powiedzmy w producencie while (1){ if (ile == 100) break; while ((we+1) % MAKS == wy); //bufor jest pelny produkuj(); } exit(0); } if (pid == 0) { //jesetesmy w procesie potomnym - konsumencie while (1){ while (we == wy); //bufor jest pusty konsumuj(); } exit(0); } return 0; } To jednak nie działa, bo jak się przekonałem proces potomny dostaje na początku tylko kopię rejestrów procesu macierzystego, ale później zmienne we, wy, bufor, nie są już wspólne. Czy ktoś mógłby poprawić mój kod tak, aby spełniał swoje zadanie? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
xdarkflame Napisano Listopad 17, 2009 Zgłoszenie Share Napisano Listopad 17, 2009 Niestety oprawić nie mogę , bo nie umiem ani mi się uczyć nie chce. Ogólnie to fork() tworzy kopię programu, czyli efekt jest taki jakby uruchomić dwa oddzielne programy (o oddzielnych przestrzeniach adresowych). Zatem trzeba by użyć jakieś metody komunikacji między procesami, np przez plik, tcp czy inne pipe'y.hf Jeśli piszę tu jakieś bzdury, to proszę aby ktoś mnie poprawił. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się