Esercizio con i segnali

di il
7 risposte

Esercizio con i segnali

In questo esercizio il processo padre deve inviare un segnale SIGUSR1 e il processo figlio ricevendo il segnale deve stampare a video un messaggio (sto terminando l'esecuzione) e deve terminare l'esecuzione. Non capisco perchè non funziona, cioè non dà errori ma il processo figlio non stampa il messaggio.

Ecco il codice:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void handelr(int sig){
	sig=sig;
	printf("sto terminando la mia esecuzione\n");
	_exit(0);
}

int main(){
	pid_t pid;
	if ((pid=fork())==-1){
		fprintf(stderr,"errore fork() \n");
		exit(0);
	}
	if (pid == 0){
		if (signal(SIGUSR1,handelr) == SIG_ERR){
				fprintf(stderr,"errore signal() \n");
				exit(0);
			}
		for (;;){
			
			printf("sono il figlio e sto ciclando all’infinito!\n");
			printf("questo messaggio non dovrebbe mai essere visualizzato!\n");
			exit(0);
		}
	}else{
		/* il padre invia un segnale SIGUSR1 al figlio */
		sleep(3);
		kill(pid, SIGUSR1);
		printf("\nsono il padre!\n");
		exit(0);
	}

	exit(0);
}

7 Risposte

  • Re: Esercizio con i segnali

    Ciao
    ti voglio aiutare ma
    stai lavorando sotto linux o sotto windows ?
  • Re: Esercizio con i segnali

    Ciao comunque a prescindere da se è linux o windows hai dimenticato di installare il gestore dei segnali che hai definito.
    per installarlo devi fare prima della fork
    signal(SIGUSR1,handler); // ho usato il tuo caso specifico ma lo puoi adattare a tutti i segnali gestibili
  • Re: Esercizio con i segnali

    Grazie per la risposta
    Allora io utilizzo linux. Ho provato ad aggiungere la linea di codice che mi hai suggerito ma non funziona come dovrebbe lo stesso, infatti non stampa "sto terminando la mia esecuzione" (dovrebbe essere stampata dal processo figlio).
    Tu hai provato a farlo funzionare?
  • Re: Esercizio con i segnali

    Ad un rapido sguardo il codice è perfetto.
    Unica cosa,sotto linux è sempre gradito un fflush quando si vuole essere sicuri che il messaggio appaia a schermo:
    
    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    void handelr(int sig){
       sig=sig;
       printf("sto terminando la mia esecuzione\n");
       fflush(stdout);
       _exit(0);
    }
    
    int main(){
       pid_t pid;
       if ((pid=fork())==-1){
          fprintf(stderr,"errore fork() \n");
          exit(0);
       }
       if (pid == 0){
          if (signal(SIGUSR1,handelr) == SIG_ERR){
                fprintf(stderr,"errore signal() \n");
                exit(0);
             }
          for (;;){
    
             printf("sono il figlio e sto ciclando all’infinito!\n");
             fflush(stdout);
             printf("questo messaggio non dovrebbe mai essere visualizzato!\n");
             fflush(stdout);
             exit(0);
          }
       }else{
          /* il padre invia un segnale SIGUSR1 al figlio */
          sleep(3);
          kill(pid, SIGUSR1);
          printf("\nsono il padre!\n");
          exit(0);
       }
    
       exit(0);
    }
    
    testato e funzionante.
  • Re: Esercizio con i segnali

    Nel modo sopra non stampa "sto terminando la mia esecuzione".
    Sono riuscito a risolvere cosi:
    
    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    void handelr(int sig){
       sig=sig;
       fprintf(stderr,"sto terminando la mia esecuzione\n");
       fflush(stdout);
       _exit(0);
    }
    
    int main(){
       pid_t pid;
       if ((pid=fork())==-1){
          fprintf(stderr,"errore fork() \n");
          exit(0);
       }
       if (pid == 0){
          if (signal(SIGUSR1,handelr) == SIG_ERR){
                fprintf(stderr,"errore signal() \n");
                exit(0);
             }
          for (;;){
    
             printf("sono il figlio e sto ciclando all’infinito!\n");
             fflush(stdout);
             printf("questo messaggio non dovrebbe mai essere visualizzato!\n");
             fflush(stdout);
             while(1);
          }
       }else{
          /* il padre invia un segnale SIGUSR1 al figlio */
          sleep(3);
          kill(pid, SIGUSR1);
          printf("\nsono il padre!\n");
          exit(0);
       }
    
       exit(0);
    }
    
    in questo modo stampa anche "sto terminando la mia esecuzione". In pratica ho aggiunto solo un ciclo infinito ( while(1) ).
    scusate se rispondo tardi ma sono stato occupato questa settimana.
    Grazie a tutti per l'aiuto comunque
  • Re: Esercizio con i segnali

    Ciao,
    ma perché scrivi su stderr e poi fai il flush di stdout? Può essere quello il problema?
  • Re: Esercizio con i segnali

    Cosi funziona, facendo delle modifiche avevo provato a cambiare un pò di cose. In effetti cosi sembra avere poco senso (dovrei cambiarlo per maggior correttezza), però ottengo il mio risultato ed era un esercizio solo per capire un pò i segnali.
    Comunque grazie!
Devi accedere o registrarti per scrivere nel forum
7 risposte