Strona 1 z 1
Operacje na zmiennych w C przy użyciu fork().
: 27 mar 2011, 14:00
autor: Cooler1989
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ć?
Re: Operacje na zmiennych w C przy użyciu fork().
: 27 mar 2011, 16:56
autor: bigfun
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)
Re: Operacje na zmiennych w C przy użyciu fork().
: 27 mar 2011, 17:12
autor: Cooler1989
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.
Re: Operacje na zmiennych w C przy użyciu fork().
: 27 mar 2011, 17:59
autor: ethanak
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ć?
Re: Operacje na zmiennych w C przy użyciu fork().
: 28 mar 2011, 09:40
autor: pax0r
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?
Re: Operacje na zmiennych w C przy użyciu fork().
: 28 mar 2011, 11:53
autor: kabooom
dokładnie użyj sygnałów, tym bardziej, że
Chodzi tylko o 2 stanową zmienną, którą mógłbym przekazać do drugiego procesu.
Re: Operacje na zmiennych w C przy użyciu fork().
: 01 kwie 2011, 16:15
autor: Cooler1989
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ęć:
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);
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ć:
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);