program się zawiesza

0

Witam, mam taki problem, że nie wykonuje mi się funkcja

 exit(0)

Program wiesza się po usunięciu dowiązania, nie wiem dlaczego.

Wynik programu:

 
Utworzono pamiec dzielona
Utworzono dowiazanie....!!

Semafor opuszczony. Jego wartosc to: -1 
Utworzono pamiec dzielona
Utworzono dowiazanie....!!

Wszystko zostalo przeslane..
------------------------------ KONSUMENT ---------------------------------------
Usunieto dowiazanie..
--> teraz powinna się wykonać funkcja exit(0) 

Po nacisnieciu klawiszy ctrl + c

 
Utworzono pamiec dzielona
Utworzono dowiazanie....!!

Semafor opuszczony. Jego wartosc to: -1 
Utworzono pamiec dzielona
Utworzono dowiazanie....!!

Wszystko zostalo przeslane..
------------------------------ KONSUMENT ---------------------------------------
Usunieto dowiazanie..^Cmake: *** wait: Brak procesów potomnych. Stop.
make: *** Oczekiwanie na niezakończone zadania....
make: *** wait: Brak procesów potomnych. Stop.

Funkcja usuwająca dowiązanie:

 
void usun_dowiazanie(void *id_pamieci)
{
	if(shmdt(id_pamieci) == -1)
	{
		perror("Nie mozna usunac dowiazania..");
		exit(1);
	}
	else 
		printf("Usunieto dowiazanie..");
}

Petla z konsumenta:

 
while(1)
	{  
		licznik = 0;
		while(licznik < rozmiar_jednostki)              //Przenosimy dane(tekst) ze struktury do tablicy
		{
			tablica[licznik] = wsk_struktury1 -> b[wsk_struktury1 -> j][licznik];
			printf("%c",tablica[licznik]); //do pliku
		             
			if(tablica[licznik] == '\0')
			{
				printf("Wszystko zostalo przeslane..\n");

				if(write(zapis,tablica,licznik) == -1)         /*Zapisujemy tekst do pliku*/
				{
					perror("Blad zapisu\n");
					exit(1);
				}
			
				printf("------------------------------ KONSUMENT ---------------------------------------\n");
				usun_dowiazanie(wsk_struktury1);
				exit(0);
				printf("------------------------------ KONSUMENT ---------------------------------------\n");
			}
		licznik++;
		}
		           
		if(write(zapis, tablica, rozmiar_jednostki) == -1)         //zapisanie tekstu do pliku
		{
			perror("Blad zapisu..\n");
			exit(1);
	 	}   		
	
		//printf("Opuszczam semafor PELNY\n");
		opusc_semafor(identyfikator_semafor, 1);
		wsk_struktury1 -> j = ((wsk_struktury1 -> j ) +1 ) % rozmiar_bufora;
		//printf("Podniesiono semafor Pusty\n");
		podnies_semafor(identyfikator_semafor,0);
	}
0

Pomoże ktoś?
To jest w ogóle jakieś dziwne, że ta funkcja

exit(0) 

się nie wywołuje. A poprzednia funkcja usun_dowiazanie(wsk_struktury1)

 kończy się prawidłowo. Tam nie ma co jej zatrzymywać a mimo to program się zawiesza :(
Siedzę nad tym błędem już 2 dzień i nie wiem co jest nie tak...
0

Co pokazuje debugger? Jeśli masz po drodze jakieś UB to wszystko może się zdarzyć.

0

Buuu co za brzydki kod exit... A wiesz, ze wypisanie drugiego napisu konsument nie ma prawa sie wykonać? Nie wiem co jest w innych momentach kodu, ale używanie funkcji exit tylko dla osob zaznajomionych lepiej z programowaniem i językiem i nie powinno się tego nadużywać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1