Operacje na zmiennych w C przy użyciu fork().
- Cooler1989
- Sędziwy Jeż
- Posty: 35
- Rejestracja: 14 maja 2007, 15:02
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Kontakt:
Operacje na zmiennych w C przy użyciu fork().
Piszę program umożliwiający wysyłanie wiadomości z terminala z jednego komputera do terminala drugiego kompueteraz znajdującego się w sieci LAN. W celu równoczesnego wysyłania wiadomości i odbierania po obu stronach rozdzieliłem główny wątek za pomocą funkcji fork(). Mam teraz problem. W jednym wątku programu (wysyłanie wiadomości) pobieram wiadomość z klawiatury do wysłania lub pobieram polecenie. Mam takie polecenie, które ma zmienić parametry drugiego toru ( odbieranie wiadomości) . Chciałem to zrobic za pomocą zmiennej globalnej bool, ale zamiana wartości tej zmiennej w jednym torze nie powodowała zmiany wartości w drugim torze. Probowałem to zrobić za pomocą wskaźników - wyznaczając wspólne miejsce w pamięci, ale to także nie pomogło. Dlaczego to nie działa i co można z tym zrobić?
-
- Serdeczny Borsuk
- Posty: 109
- Rejestracja: 20 mar 2011, 19:08
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Warszawa
- Kontakt:
Re: Operacje na zmiennych w C przy użyciu fork().
Nie działa ponieważ przy pomocy fork() tworzysz nowe procesy a nie wątki. Zainteresuj się biblioteką pthread do obsługi wątków, w Twoim przypadku powinna mieć zdecydowanie lepsze zastosowanie.
Jeśli koniecznie chcesz to zrobić wykorzystując procesy, to poczytaj o metodach komunikacji międzyprocesowej - http://www.advancedlinuxprogramming.com ... 05-ipc.pdf (jeśli interesujesz się na poważnie programowaniem pod linuksem polecam przeczytanie tej książki w całości)
Jeśli koniecznie chcesz to zrobić wykorzystując procesy, to poczytaj o metodach komunikacji międzyprocesowej - http://www.advancedlinuxprogramming.com ... 05-ipc.pdf (jeśli interesujesz się na poważnie programowaniem pod linuksem polecam przeczytanie tej książki w całości)
"Never argue with idiot. He will drag you down to his level and then beat with experience."
Nie udzielam pomocy poza forum.
Nie udzielam pomocy poza forum.
- Cooler1989
- Sędziwy Jeż
- Posty: 35
- Rejestracja: 14 maja 2007, 15:02
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Kontakt:
Re: Operacje na zmiennych w C przy użyciu fork().
Narazie mam zaimplementowane fork() i wszystko działa jak powinno prócz tego jednego elementu, a dotychczas nie opanowałem kontroli thread'ów. Zainteresuje się tym w najbliżej przyszłości, ale to jeszcze postaram się rozwiązać bez konieczności opanowania obsługi wątków.
Z drugiej strony to co Ty mi wysłałeś też wygląda na skomplikowane.. :/ Może ktoś mi chociaż powie która z tych metod będzie najprostsza? Chodzi tylko o 2 stanową zmienną, którą mógłbym przekazać do drugiego procesu.
Z drugiej strony to co Ty mi wysłałeś też wygląda na skomplikowane.. :/ Może ktoś mi chociaż powie która z tych metod będzie najprostsza? Chodzi tylko o 2 stanową zmienną, którą mógłbym przekazać do drugiego procesu.
- ethanak
- Wygnańcy
- Posty: 3054
- Rejestracja: 04 gru 2007, 13:19
- Płeć: Mężczyzna
- Wersja Ubuntu: 12.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Bielsko-Biała
- Kontakt:
Re: Operacje na zmiennych w C przy użyciu fork().
No dobrze... ale jak chcesz rozwiązać sprawę tego jednego elementu (wymagającego wątków) za pomocą procesów (czyli dziedziczenia zmiennych i niemożności przekazania wartości do procesu tworzącego)?
Owszem, da się... tylko po co sobie aż tak życie komplikować?
Owszem, da się... tylko po co sobie aż tak życie komplikować?
- pax0r
- Sędziwy Jeż
- Posty: 70
- Rejestracja: 10 lut 2011, 14:18
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
Re: Operacje na zmiennych w C przy użyciu fork().
komunikacja miedzy procesami to dosc rozbudowany temat i zastanawiam sie czy nauczenie sie pthreadsow nie byloby mniej wiecej na tym samym poziomie jak nie latwiejsze 
nie wiem dokladnie co chcesz usiagnac, ale chyba w tym wypadku najprostsze byloby uzycie sygnalow?

nie wiem dokladnie co chcesz usiagnac, ale chyba w tym wypadku najprostsze byloby uzycie sygnalow?
-
- Piegowaty Guziec
- Posty: 6
- Rejestracja: 08 gru 2009, 11:38
- Płeć: Mężczyzna
- Wersja Ubuntu: 9.04
- Środowisko graficzne: GNOME
- Architektura: x86
Re: Operacje na zmiennych w C przy użyciu fork().
dokładnie użyj sygnałów, tym bardziej, że
Chodzi tylko o 2 stanową zmienną, którą mógłbym przekazać do drugiego procesu.
- Cooler1989
- Sędziwy Jeż
- Posty: 35
- Rejestracja: 14 maja 2007, 15:02
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Kontakt:
Re: Operacje na zmiennych w C przy użyciu fork().
Zrobiłem tak jak w pdfie który mi poleciliście. Użyłem komunikacji za pomocą dzielenia pamięci. Mój pseudo komunikator posiada osobne programy server i client w których sa po dwa procesy - jeden czeka na odbiór wiadomości drugi na wpisanie wiadomości do wyslania. Ponizej przedstawiam kod który zaimplementowałem z przykładu pdf'a. Przykald ten działa, ale tylko w kliencie. Na serwerze próbowałem wprowadzić w taki sam sposób wspólną pamięć, ale nie działa. Gdy taki sam mechanizm dzielenia pamięci w serwerze to mój program po poleceniu fork() tworzy tylko jeden proces, a drugi jakby pomija (wysyła wiadomości, ale nie odbiera). Wiecie dlaczeo tak się może dziać?
Użyłem tej części przykłądu aby stworzyć wspólną pamięć:
I tej części, aby odwołać sie do tej pamięci i osobno dla każdego procesu w zależności od potrzeb ją modyfikować:
Użyłem tej części przykłądu aby stworzyć wspólną pamięć:
Kod: Zaznacz cały
int segment_id;
int* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x0001;
/* Allocate a shared memory segment. */
segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/* Attach the shared memory segment. */
shared_memory = (int*) shmat (segment_id, 0, 0);
//printf ("shared memory attached at address %p\n", shared_memory);
/* Determine the segment’s size. */
shmctl (segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
//printf ("segment size: %i\n", segment_size);
/* Write a string to the shared memory segment. */
*shared_memory=1;
/* Detach the shared memory segment. */
shmdt (shared_memory);
Kod: Zaznacz cały
/* Reattach the shared memory segment, at a different address. */
shared_memory = (int*) shmat (segment_id, (void*) 0x5000000, 0);
//printf ("shared memory reattached at address %p\n", shared_memory);
//MODYFIKACJA LUB ODCZYTANIE Shared_memory;
/* Detach the shared memory segment. */
shmdt (shared_memory);
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości