Sygnały, problem z funkcja execl

0
#include <stdio.h>
#include <stdlib.h>

/* obsluga sygnalow */
#include <sys/types.h>
#include <signal.h>

#include <unistd.h> /* execl(); */
#include <errno.h>

int main(int argc, char *argv[])
{
	if (argc != 3)
	{
		perror ("Nieprawidlowa liczba argumentow.");
		exit (EXIT_FAILURE);
	}
	char *dzialanie = argv[1];
	int sygnal = atoi (argv[2]);
	printf ("Uruchamiam program obsluga.x z parametrem \"%s\"...\n", dzialanie);
	pid_t pid;
	switch ( pid = fork () )
	{
		case -1:
			perror ("Tworzenie procesu potomnego nie powiodlo sie.");
			exit (EXIT_FAILURE);
			break;

		case 0:
			execl ("obsluga1.x", "obsluga1.x", dzialanie, sygnal , (char*) NULL); /* uruchomienie programu obsluga.x przez funkcje execl */
			break;
		
		default:
			sleep(1);
			kill( pid , 0 );
			if ( errno != ESRCH)
		{
			printf ("Wysylam sygnal %d do procesu o identyfikatorze %d...\n", sygnal, pid);
			kill (pid, sygnal);
		}
			else
			perror( " bląd"); // Sprawdzymy czy sie udało 
			break;
	}
	printf ("Koncze.\n");
	sleep(30);
	return EXIT_SUCCESS;
}

Kod obslugi1.x: https://4programmers.net/Forum/C_i_C++/306536-sygnal_nie_odbieranie_sygnalu

Wynikiem program odpalajac go z termianalu trescia ./wysylaj2.x p 15
Jest:
Urochamiamy program z parametrem p
Koncze
Wysylam sygnal numer 15 do procesu z pid ..
Koncze

Nie wiem czy to dobrze rozumiem, ale po uzyciu funkcji fork tworze proces potomny, ktory bedzie czytal za pomoca funkcji execl z obsluga1. Dochodzi do rejestracji sygnalu.
W procesie macierzysty za pomoca funkcji kill wysylam sygnal do procesu potomnego, przez co w wyniku powinno pojawic sie rowniez Otrzymano Sygnal 15

1

Możliwe, że execl nie odpala Twojej appki, wtedy zwraca -1 i ustawia errno

0

Faktycznie wprowadziłem, źle argumenty do funckji execl pierwszy powinien być "./obsluga1.x" . Ale to niczego nie zmienilo. Wynki programu jest caly czas taki sam.

0

Tzn. jaki jest ten wynik? Bo jak nadal widzisz „kończę” to nadal Twój drugi program nie wstaje.
Jeśli nie widzisz ani „kończę” ani informacji o sygnale - dodałeś sleepa w tym drugim programie?
BTW, powinienneś w procesie macierzystym pozbierać śmieci po potomkach wołając wait, ale to tak poza konkursem.

0

Widzę kończe, ale nie widze informacji o sygnale. Czyli w takim razie błąd jest po stronie funkcji execl ?

1

Na to wygląda. Dlaczego nie odpalisz tego w gdb i nie sprawdzisz?

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