Operacje na zmiennych w C przy użyciu fork().

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Cooler1989
Sędziwy Jeż
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().

Post 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ć?
bigfun
Serdeczny Borsuk
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().

Post 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)
"Never argue with idiot. He will drag you down to his level and then beat with experience."

Nie udzielam pomocy poza forum.
Awatar użytkownika
Cooler1989
Sędziwy Jeż
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().

Post 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.
Awatar użytkownika
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().

Post 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ć?
Awatar użytkownika
pax0r
Sędziwy Jeż
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().

Post 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?
kabooom
Piegowaty Guziec
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().

Post 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.
Awatar użytkownika
Cooler1989
Sędziwy Jeż
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().

Post 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);
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości