Powrót do listy plików
cw3.c
/*
Program do własnej obsługi sygnałów.
*/
#include "cw3.h"
int
main (int argc, char *argv[])
{
// deklaracja zmiennych
int i;
int sig_ile; //ilość sygnałów
int *sig_id; // identyfikator sygnału
int *reakcja; // reakcja na sygnał
//sprawdzenie ilości argumentów.
if (argc == 1)
{
printf ("nie podano żadnych parametrów");
printf ("\n wywoływanie: \n $ cw3.run <sig_id> <def|ign|obs>\n");
printf ("aby usyskać instrukcję używania wywołaj program z parametrem --help\n");
exit (0);
}
/* strcmp zwraca 0 jeżeli stringi są równe więc aby uzyskać porządany efekt
należy zrobić warunek na zaprzeczenie :) */
if (!strcmp (argv[1], "--help"))
{
printf ("\n Program do własnej obsługi sygnałów.");
printf ("\n wywoływanie: \n $ cw3.run <sig_id> <def|ign|obs>");
printf ("\n \t sig_id \t identyfikator procesu (patrz lista)");
printf ("\n \t def \t\t powoduje domyślną obsługę sygnału");
printf ("\n \t ign \t\t powoduje ignorowanie sygnału (istnieją wyjątki - patrz lista)");
printf ("\n \t obs \t\t powoduje własną obsługę sygnału (istnieją wyjątki - patrz lista)");
printf ("\n \n argumenty podajemy parami (wyjątek --help), ilość dowolna");
printf ("\n");
printf ("\n lista sygnałów");
printf ("\n wpisy w kolumnie \"akcja\" oznaczają obsługę sygnału");
printf ("\n \t Term \t ubicie procesu");
printf ("\n \t Ign \t ignorowanie sygnału");
printf ("\n \t Core \t ubicie procesu ze zrzutem pamięci (core)");
printf ("\n \t Stop \t zatrzymanie procesu");
printf ("\n\n Sygnały w standardzie POSIX.1");
printf ("\n");
/* z lenistwa reszta jest w pliku tekstowym :) */
switch (fork ())
{
case -1:
perror ("fork error");
exit (1);
case 0:
printf ("aaa");
execl ("/bin/cat", "cat", "./sygnaly.txt", NULL);
perror ("execl error");
exit (2);
default:
//wait();
;
}
exit (0);
}
// sprawdzenie czy mamy dobrą ilość argumentów. KONIECZNIE po --help :)
if ((argc - 1) % 2 == 1)
{
printf ("zła liczba argumentów. \nWyowałaj program z parametrem --help aby uzyskać pomoc\n");
exit (0);
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// FIXME sprawdzić czy argumenty są w prawidłowej formie
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// początek programu. po długiej przeprawie z --help :(
printf ("Proces %d (czyli ja) czeka na sygnały\n", getpid ());
// ile mamy sygnałów. zagwarantowane mamy już że jest odpowiednia ilość argumentów
sig_ile = (argc - 1) / 2;
// dynamiczna rezerwacja pamieci na argumenty
sig_id = (int *) malloc (sig_ile * sizeof (int));
reakcja = (int *) malloc (sig_ile * sizeof (int));
for (i = 0; i < sig_ile * 2; i += 2)
{ /* przypisanie argumentow do odpowiednich zmiennych */
sig_id[i / 2] = zamien_id (argv[i + 1]);
reakcja[i / 2] = zamien_reakcje (argv[i + 2]);
printf ("Dla sygnalu %s=%i mam wykonac operację %s=%i\n",
argv[i + 1], sig_id[i / 2], argv[i + 2],
reakcja[i / 2]);
}
for (i = 0; i < sig_ile; i++)
{ /* a teraz bedziemy juz ustawiac reakcje na dane sygnaly */
if ((sig_id[i] == 9) || (sig_id[i] == 19))
{
printf ("zmiana obsługi sygnału nr %i jest niedozwolona\n Opuszczenie programu\n\n", sig_id[i]);
exit (0);
}
switch (reakcja[i])
{
case 0: //defaultowa akcja
if (signal (sig_id[i], SIG_DFL) == SIG_ERR)
{
perror ("Problem z operacja domyslna dla sygnalu...");
exit (1);
}
break;
case 1: //ignorowanie
if (signal (sig_id[i], SIG_IGN) == SIG_ERR)
{
perror ("Problem ze zignorowaniem sygnalu...");
exit (2);
}
break;
case 2: //przechwyt
if (signal (sig_id[i], przechwyt) == SIG_ERR)
{
perror ("Problem z przechwyceniem sygnalu");
exit (3);
}
break;
}
}
while (101 % 2 != 0) //poczekamy sobie do sygnału zakończenia
pause ();
return 0;
}
void
przechwyt (int a)
{
printf ("nastapiło przechwycenie sygnału\n");
}
int
zamien_reakcje (char *re)
{
if (!strcmp (re, "def"))
return 0;
else if (!strcmp (re, "ign"))
return 1;
else if (!strcmp (re, "obs"))
return 2;
else
{
printf ("zły typ obsługi. \nwywołaj program z opcją --help aby otrzymac więcej informacji\n");
exit (0);
}
}
int
zamien_id (char *id)
{
if ((atoi (id) == 1) || (!strcmp (id, "HUP")))
return 1;
else if ((atoi (id) == 2) || (!strcmp (id, "INT")))
return 2;
else if ((atoi (id) == 3) || (!strcmp (id, "QUIT")))
return 3;
else if ((atoi (id) == 4) || (!strcmp (id, "ILL")))
return 4;
else if ((atoi (id) == 6) || (!strcmp (id, "ABRT")))
return 6;
else if ((atoi (id) == 8) || (!strcmp (id, "FPE")))
return 8;
else if ((atoi (id) == 9) || (!strcmp (id, "KILL")))
return 9;
else if ((atoi (id) == 11) || (!strcmp (id, "SEGV")))
return 11;
else if ((atoi (id) == 13) || (!strcmp (id, "PIPE")))
return 13;
else if ((atoi (id) == 14) || (!strcmp (id, "ALRM")))
return 14;
else if ((atoi (id) == 15) || (!strcmp (id, "TERM")))
return 15;
else if ((atoi (id) == 10) || (!strcmp (id, "USR1")))
return 10;
else if ((atoi (id) == 12) || (!strcmp (id, "USR2")))
return 12;
else if ((atoi (id) == 17) || (!strcmp (id, "CHLD")))
return 17;
else if ((atoi (id) == 18) || (!strcmp (id, "CONT")))
return 18;
else if ((atoi (id) == 19) || (!strcmp (id, "STOP")))
return 19;
else if ((atoi (id) == 20) || (!strcmp (id, "TSTP")))
return 20;
else if ((atoi (id) == 21) || (!strcmp (id, "TTIN")))
return 21;
else if ((atoi (id) == 22) || (!strcmp (id, "TTOU")))
return 22;
else
{
printf ("zły identyfikator procesu. \nwywołaj program z opcją --help aby otrzymac więcej informacji\n");
exit (0);
}
}
składania pokolorowana przez
Code2HTML, v. 0.9.1
Materiały z Systemów Operacyjnych udostępnione zostały na zasadach licencji GPL w wersji 2.