Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C] Processi e segnali

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [C] Processi e segnali

    Sto affrontando questo argomento e vorrei essere aiutato sulla risoluzione di un quesito.
    L'intero quesito non mi interessa al momento quindi c'è qualcosa nel codice che è di più, quello che mi interessa sarebbe far funzionare due processi figli quando il padre invia un segnale SIGUSR1 ma purtroppo non ci riesco. Posto il codice, dov'è che sbaglio?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
    #include <string.h>
    
    
    int sblocca = 0;
    
    
    void signalHandler (int signo);
    
    
    int main (int argc, char *argv[]) {
    	
    	pid_t figlioA, figlioB;
    	int fdpipe[2];
    	char buffer[10] = "CiaoMondo";
    
    
    	if(pipe(fdpipe) < 0) {
    		printf("Errore nella creazione della pipe\n");
    		exit(1);
    	}
    
    
    	signal(SIGUSR1, signalHandler);
    
    
    	switch(figlioA = fork()) {
    		case -1:
    			printf("Errore durante la creazione del figlioA\n");
    			exit(2);
    		case 0:
    			close(fdpipe[1]); //Chiudo scrittura nel figlio A
    			while(sblocca == 0) {
    				printf("%d - A Dorme\n", getpid());
    				sleep(1);
    			}
    			printf("Sono il processo %d e termino\n", getpid());
    			break;
    		default:
    			switch(figlioB = fork()) {
    				case -1:
    					printf("Errore durante la creazione del figlioB\n");
    					exit(3);
    				case 0:
    					close(fdpipe[1]); //Chiudo scrittura nel figlio B
    					while(sblocca == 0) {
    						printf("%d - B Dorme\n", getpid());
    						sleep(1);
    					}
    					printf("Sono il processo %d e termino\n", getpid());
    					break;
    			}
    			close(fdpipe[0]); //Chiudo lettura nel padre
    			sleep(5);
    			write(fdpipe[1], &buffer, strlen(buffer));
    			printf("Sono il padre, ho scritto nella pipe ed invio un segnale SIGUSR1\n");
    			kill(SIGUSR1, 0);
    			waitpid(0, NULL, 0);
    			printf("Sono il padre e termino\n");
    	}
    	exit(0);
    }
    
    
    void signalHandler (int signo) {
    	signal(SIGUSR1, signalHandler);
    	if(signo == SIGUSR1) {
    		sblocca = 1;
    	}
    }
    Purtroppo mi rimane in loop sui while (soluzione migliorabile utilizzando le variabili di condizione?), quindi deduco che questo segnale non venga mai captato. Dov'è che sbaglio?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    ...poco ricordole varie funzioni. Ma intanto nell'hook non serve redefinire la callback.
    La kill che "SEGNALA" non identifica correttamente il pid ma usa SIGUSR1, devi indicare il processo.
    Probabilmente ce qualcosa che non va anche sul loop che controlla "sblocca".
    Per gli Spartani e Sparta usa spartan Il mio github

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.