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 ;P
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);