Segnali

di il
4 risposte

Segnali

Buongiorno a tutti,
vi illustro il testo dell'esercizio che dovrei dare:
"Esercizio 4 (signal handler):
Scrivere un programma C che:
Crea un figlio;
Intercetta tramite handler apposito i segnali SIGUSR1, SIGUSR2; quando riceve il segnale x, visualizza
“Ricevuto il segnale x”;
Riceve in input su riga di comando una sequenza di interi x1,x2,...xk.
In un ciclo infinito ad intervalli regolari, invia al processo figlio uno dei segnali ricevuti in input.
Il processo figlio:
Intercetta I segnali SIGUSR1, SIGUSR2 e SIGINT;
Blocca tutti I segnali eccetto SIGUSR1, SIGUSR2 e SIGINT;
Quando riceve SIGUSR1 invia al padre SIGUSR2;
Quando riceve SIGUSR2 invia al padre SIGUSR1;
Quando riceve SIGINT invia al padre SIGINT."

Ora quello che ho fatto io:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void signal_manager_father(int signal){
	switch(signal){
		case SIGUSR1:
			printf("Ricevuto il segnale SIGUSR1\n");
			break;
		case SIGUSR2:
			printf("Ricevuto il segnale SIGUSR2\n");
			break;
	}
}
void signal_manager_child(int signal){
	switch(signal){
		case SIGUSR1:
			kill(getppid(),SIGUSR2);
			break;
		case SIGUSR2:
			kill(getppid(),SIGUSR1);
			break;
		case SIGINT:
			kill(getppid(),SIGINT);
			exit(1);
	}
}

int main(int argc,char **argv){
	int pid,i;
	if((pid=fork())){//Padre
		signal(SIGUSR1,signal_manager_father);
		signal(SIGUSR2,signal_manager_father);
		for(i=1;1;i=i%(argc-1)+1){
			kill(pid,atoi(argv[i]));
			sleep(2);
			sleep(2);
		}
	}
	else{//Figlio
		signal(SIGUSR1,signal_manager_child);
		signal(SIGUSR2,signal_manager_child);
		signal(SIGINT,signal_manager_child);
		for(i=0;i<32;i++)
			if(i!=SIGUSR1&&i!=SIGUSR2&&i!=SIGINT)
				signal(i,SIG_IGN);
		while(1)
			pause();
	}
	return 0;
}
Il problema è che non riesco a capire perchè non funzioni, se qualcuno di voi può aiutarmi ve ne sarei molto grato

4 Risposte

  • Re: Segnali

    Risolto!!!
  • Re: Segnali

    Nanni16 ha scritto:


    Risolto!!!
    Avresti la bontà di farci sapere come ?
  • Re: Segnali

    L'ho modificato cosi:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    
    void signal_manager_father(int signal){
    	switch(signal){
    		case SIGUSR1:
    			printf("Ricevuto il segnale SIGUSR1\n");
    			break;
    		case SIGUSR2:
    			printf("Ricevuto il segnale SIGUSR2\n");
    			break;
    	}
    }
    void signal_manager_child(int signal){
    	switch(signal){
    		case SIGUSR1:
    			kill(getppid(),SIGUSR2);
    			break;
    		case SIGUSR2:
    			kill(getppid(),SIGUSR1);
    			break;
    		case SIGINT:
    			kill(getppid(),SIGINT);
    			exit(1);
    	}
    }
    void null(int signal){}
    
    int main(int argc,char **argv){
    	int pid,i;
    	if((pid=fork())){//Padre
    		signal(SIGUSR1,signal_manager_father);
    		signal(SIGUSR2,signal_manager_father);
    		for(i=1;1;i=i%(argc-1)+1){
    			sleep(2);
    			sleep(2);
    			kill(pid,atoi(argv[i]));
    		}
    	}
    	else{//Figlio
    		signal(SIGUSR1,signal_manager_child);
    		signal(SIGUSR2,signal_manager_child);
    		signal(SIGINT,signal_manager_child);
    		for(i=1;i<32;i++)
    			if(i!=SIGUSR1&&i!=SIGUSR2&&i!=SIGINT)
    				signal(i,null);
    		while(1)
    			pause();
    	}
    	return 0;
    }
    Il problema per quello che ho capito è che bisogna stare attenti al fatto che il 'figlio' vada in pause() prima che il padre spedisca un segnale!!!!
  • Re: Segnali

    Nanni16 ha scritto:


    L'ho modificato cosi:
    Grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte