try - catch nie działa?

0

Hej!
Mam fragment kodu:

	//--- przeniesienie do pracy w tle
	int pid = fork();
	if (pid<0) {
		blad << "Error: child process not created!" << endl;
		SaveLog("E: Couldn't move to background");
		f_background = true;
		exit(-12);		// fork error
	}
	else if (pid>0) {
		SaveLog(txt2string("--> Exiting parent process.  Child's (background) PID: ").append(int2string(pid)));
		exit(3);			// parent exits
		SaveLog(" ... Parent after 'fork'");		// chyba to nie zadziała
	}
	//else => pid=0 => jestem w procesie 'child'

//--- odtąd jest najważniejsze 
	SaveLog(" ... Child after 'fork'");
	try {
		LoadNet();
	} catch (...) {
		SaveLog("E: LoadNet failed!");
	}
	SaveLog(" ... Child after 'LoadNet'");

Tworzę sobie proces child i wywołuję z niego procedurę LoadNet. Mimo, iż jest ona w bloku TRY...CATCH, to w logu zapisuje się jedynie:

... Child after 'fork'

W LoadNet nie mam żadnego exit. Wygląda więc, że w niej wyskakuje jakiś wyjątek. Nie rozumiem tylko, dlaczego mój 'catch' go nie wychwytuje.
Co tu jest źle?

2

jeżeli masz mazanie po pamięci to C++ nie łapię tego w wyjątkach

0

Tak jak robisz to Twój child ginie razem z rodzicem.
Poczytaj o "double fork()", setsid(), ewentualnie sięgnij do źródła:

https://www.amazon.com/dp/0201433079/

0
_13th_Dragon napisał(a):

jeżeli masz mazanie po pamięci to C++ nie łapię tego w wyjątkach

Znalazłem powód. W funkcji stosowanej w LoadNet odwoływałem się do niezainicjowanej tablicy.
Nie wiem tylko, dlaczego catch tego wyjątku nie łapie. Jakieś wyjaśnienie i sugestia, co zrobić, aby wszystkie wyjątki można była wyłapać?

4

Bo to nie wyjątek tylko błąd naruszenia pamięci, system wtedy wysyła sygnał do takiego procesu i dany proces popełnia harakiri. Możesz spróbować to obsłużyć przez sigaction (na Linuksach), ale to jest bardzo BARDZO niebezpieczne i wcale nie naprawi działania programu.

2

Offtopic:

Blackhole napisał(a):
		exit(3);			// parent exits
		SaveLog(" ... Parent after 'fork'");		// chyba to nie zadziała

polecam doczytać dokumentację std::exit to wtedy się wyjaśni czemu SaveLog wydaje się nie działać.

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