#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