Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] uso dei segnali tra un processo padre e processo figlio

    salve ragazzi,

    volevo chiedere il vostro aiuto in quanto sono alla prime armi con l'uso delle fork() e dei segnali. Non so se sia utile ma vi specifico che uso fedora 14. Vi chiedo aiuto perche volevo creare un programmino che non fa altro che crea un file temporaneo e creare un processo figlio. A questo punto, il padre scrive sul file, il figlio aspetta che il padre scriva, una volta completata l'operazione di scrittura invia un segnale al figlio tramite kill(pid,SIGUSR1), che a sua volta legge il file ed invia al padre un altro segnale tramite kill(getppid(),SIGUSR2). il tutto ripetuto "n" volte, con n inserito da tastiera.

    Dato che nn mi funzionava ho provato a fare semplicemente una printf del "padre" che dice "padre e scrivo" ed una al figlio che dice "figlio leggo". ho usato una var globale chiamata "m", ed ho fatto un ciclo while con un pause(). ma mi viene schedulato prima n volte il padre e poi n volte il figlio.

    VI posto il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <signal.h>
    
    static void sig_usr(int); //handler
    int m=0;
    
    // qui quando uno dei due invia il segnale la var m cambia, in modo da dare opportunita di "muoversi" solo ad 1 dei 2 processi
    static void sig_usr(int signo){
    
       if (signo==SIGUSR1) m=1;
       else m=0;
    }
    
    int main(){
    
    int i=0,n=0;
    pid_t pid;
    
      printf("inserisci il numero intero: ");
      scanf("%d", &n);
          signal(SIGUSR1,sig_usr); // installo i segnali
          signal(SIGUSR2,sig_usr);
    
              pid=fork();
    
    // ciclo per n volte
    for(i=0;i<n;i++){
    
    	if (pid==0){
                while(m==0) // finche m=0 significa che è il padre ad agire
    	      pause();
                    printf("\n Sono il figlio pidfiglio=%d pidpadre=%d\n",getpid(),getppid());
                kill(getppid(),SIGUSR2);
                        }
            else {
                 while(m==1) // se m=1 è il figlio ad agire
                   pause();
                    printf("\n Sono il padre pidfiglio=%d pidpadre=%d\n\n",pid,getpid());
                 kill(pid,SIGUSR1);
                  }
    	         }
    }
    mi potete aiutare a caprie perchè non funziona??

  2. #2
    per favore mi potete aiutare??
    il programma nn deve far altro che eseguire "atomicamente" un pezzo di codice o un altro. Devo farlo con i segnali, nn posso usare ne semafori ne nessun' altra struttura di questo genere. quindi mettere in pause un processo fin quando l'altro nn ha finito, risvegliare il secondo e mettere in pausa il primo.

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.