Wznawianie kilku procesów jednym sygnałem

0

Cześć! Potrzebuje pomocy przy realizacji takiego problemu: mam 3 procesy potomne i 1 proces macierzysty. Procesy potomne są zastopowane sygnałem SIGSTOP(macierzysty nie). Operator(użytkownik) wysyła do któregoś z tych 3 procesów jeden sygnał(ma działać dla każdego), który ma spowodować wznowienie się wszystkich. Korzystam z biblioteki signals.h, ale funkcja ktora jest handler'em nie działa:

 void wznow(int sig)
{
	if(pid_parent == getpid())//jesli sygnal odebral rodzic
	{
		kill(pid3, 25);
		kill(pid2, 25);
		kill(pid1, 25);
	}
	else//jesli odebral proces potomny
		kill(pid_parent, 25);
}

Próbowałem już na wiele sposobów, ale żaden nic nie dał. Główny problem polega na tym, że proces zastopowany może odebrać tylko sygnały SIGCONT i SIGKILL(którego nie można przechwycić).
Za wszelką pomoc dziękuję :)

PS: Pracuje na UNIX'ie

1

Poczytaj o grupach procesow (funkcja setsid). Mozesz stworzyc grupe procesow: 1 macierzysty oraz 3 zastopowane potomne. Gdy sygnal zostanie wyslany do ktoregokolwiek z nich, macierzysty odbierze ten sygnal i bedzie mogl wznowic pototomne.

0

setsid ustawia ID sesji, do grupy jest setpgid. Zresztą to nie powinno miec znaczenia, jak wyślesz do macierzystego cała grupa (PG, process group) dostanie, pytanie tylko który co przechwyci i jak obsłuży. Najprościej zawsze robić kill(0, signo) w dowolnym procesie, masz pewność, że dostaną wszyscy.

0

Dzięki, zaraz wypróbuje to i dam znać czy działa :)

0
 void wznow(int sig)
{
	if(pid_parent == getpid())//jezeli sygnal otrzymal proces macierzysty
	{
		killpg(0,25);
	}
	else//sygnal otrzymal proces dziecka
	{
		kill(pid_parent, 25);//wysylam sygnal do rodzica
	}
}

Ta funkcja działa :). Ale teraz mam następujący problem: kiedy zatrzymam program przed wykonaniem funkcji fgets() i później go wznowie to po wpisaniu jakiejkolwiek wartości ona nie zostaje już przetworzona, a proces, w którym fgets jest widoczny w drzewie procesów jako <defunct>. Jakieś pomysły jak się tego pozbyć? W przypadku ładowania wartości losowych z pliku urandom wszystko dobrze działa po wznowieniu, więc problem jest w funkcji fgets.

0

<defunct> o ile wiem oznacza, że proces nie żyje (bo dostał sygnałem) i czeka na wywołanie wait albo czegoś podobnego w procesie rodzica. Nie dostajesz gdzieś informacji o SIGTTIN/SIGTTOUT?

0

Dostaje informację o błędzie interrupted system call. Wiesz co może to powodować?

0

Przyjście sygnału w trakcie syscalla. ERRNO == EINT?

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