Sygnał, nie odbieranie sygnału

Sygnał, nie odbieranie sygnału
EX
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:24
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h> 

	
void sighandler ( int mysignal) // Gdy wyślemy sygnał wykona się ciało tej funkcji 
{
  	printf (" Otrzymano sygnał %d\n", mysignal);
	signal(mysignal , sighandler);
}


 int main ( int argc , char *argv[] )
  {
    char *nazwa = argv[0]; // Pierwszy argument z konsoli
      if ( argc != 3 && argc != 2 )
        perror("Nieprawidłowa liczba argumentów");
	  
	  int mysignal; 
          char *rodzaj_sygnalu = argv[1]; // Drugi argument z konsoli
	  
             if( argc == 2) // nie podobano kodu syngnalu w lini komend
		{
		   pause ();
		}

		else 
		 {
		     char *numer_sygnalu = argv[2]; // Trzeci argument z konsoli
		     
		     mysignal = atoi(numer_sygnalu);
		 }	

		  switch ( rodzaj_sygnalu[0] )
		   {
			case ( 'd'):
			  signal (mysignal , SIG_DFL);
			  break;

			case ('i'):
			  signal (mysignal , SIG_IGN);
   			  break;

			case ('p'):
			  signal(mysignal, sighandler);
			  break;

			default:
			  printf("Prawidłowy rodzaj sygnalu to <d/i/p>");
			  break;
		   }



printf("Koniec programu");
return 0;
}

Program odpalany jest w konsoli wraz z podaniem dwoch argumentow. ./nazwa p 15. Powinno wymusić od programu zrealizowanie funkcji sighandler.

edytowany 2x, ostatnio: Exceleent
flowCRANE
Pamiętaj, że znacznik kodu trzeba zamknąć, czyli pisze się np. ```c (w miejscu c podaje się nazwę języka), w kolejnej linii wkleja się kod i w następnej wpisuje się samo ```, które zamyka blok kodu.
nalik
  • Rejestracja:ponad 9 lat
  • Ostatnio:27 dni
  • Postów:1039
1
Exceleent napisał(a):

Program odpalany jest w konsoli wraz z podaniem dwoch argumentow. ./nazwa p 15. Powinno wymusić od programu zrealizowanie funkcji sighandler. Dlaczego tak sie nie dzieje ?

Musisz jeszcze ten sygnał wysłać, bo jak na razie to jedynie zarejestrowałeś sighandler. Dodaj na końcu programu pętlę while (TRUE) sleep(1);

W konsoli:

Kopiuj
$ ./sighandler p 15 &
[1] 91332
$ kill -15 91332
 Otrzymano sygnał 15
edytowany 3x, ostatnio: nalik
Bartosz36
@Exceleent: Jak ktoś pomógł, to zaznacz pomocny post klikając fajeczkę - warto docenić pomagającego.
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
0

BTW, użyj sigaction zamiast signal, nie będiesz musiał ustawiać obsługi sygnału drugi raz w handlerze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.