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

    [C] esercizio con pipe e segnali

    ragazzi chi mi sa aiutare con questo esercizio?

    Esercizio sulle chiamate di sistema

    Scrivere un programma C (P0) che esegue le seguenti attività:
    1 attiva in sequenza 2 figli (P1, P2) creando due canali di comunicazione monodirezionali distinti utilizzando 2 pipe (pipe1 tra P0 e P1; pipe2 tra P0 e P2);
    2 comunica il pid di P2 a P1 e di P1 a P2 attraverso le pipe;
    3 attende la terminazione dei 2 figli.

    I processi P1 e P2, dopo aver ricevuto il pid del fratello dal padre, eseguono entrambi una exec di un nuovo processo (stesso eseguibile), passando come parametro il pid del fratello. Il nuovo processo, una volta attivato, se risulta essere il fratello maggiore (pid minore) invia un segnale SIGUSR1 al fratello minore e termina. Il fratello minore, invece, attende l’arrivo del segnale SIGUSR1 e subito dopo termina le attività.
    per ora ho scritto questo, ma non sono neanche riuscito a fare a meno di quello sleep, per sincronizzare processo padre con i figli, poi non so neanche continuare col resto della traccia :S
    codice:
    #include <unistd.h>
    #include <sys/wait.h>
    #include <stdio.h>
    #include <errno.h>
    #include <sys/types.h>
    
    void gestisci(int sig){
    	printf("ricevuto\n");
    }
    
    int main(){
    	pid_t pid1,pid2,pt;
    	int fd1[2], fd2[2];
    	int st;
    	if(pipe(fd1)<0){
    		perror("pipe1");
    		_exit(-1);
    	}
    	if(pipe(fd2)<0){
    		perror("pipe2");
    		_exit(-1);
    	}
    	pid1=fork();
    	if(pid1<0){
    		perror("fork");
    		_exit(-1);
    	}
    	if(pid1==0){
    		signal(SIGUSR2,gestisci);
    		close (fd2[0]);
    		close (fd2[1]);
    		close (fd1[1]);
    		printf("xxx prova prima pause 1 xxx\n");
    		pause();
    		printf("xxx prova uscito %d xxx\n",getpid());
    		_exit(0);
    	}
    	pid2=fork();
    	if(pid2<0){
    		perror("fork");
    		_exit(-1);
    	}
    	if(pid2==0){
    		signal(SIGUSR2,gestisci);
    		close (fd1[0]);
    		close (fd1[1]);
    		close (fd2[1]);
    		printf("xxx prova prima pause 2 xxx\n");
    		pause();
    		printf("xxx prova uscito %d xxx\n",getpid());
    		_exit(0);
    	}
    	sleep(1);
    	if(write(fd1[1],&pid2,sizeof(pid_t))<0){
    		perror("write1");
    		_exit(-1);
    	}
    	kill(pid1,SIGUSR2);
    	printf("xxx segnale 1 inviato xxx\n");
    	if(write(fd2[1],&pid1,sizeof(pid_t))<0){
    		perror("write2");
    		_exit(-1);
    	}
    	kill(pid2,SIGUSR2);
    	printf("xxx segnale 2 inviato xxx\n");
    	pt=waitpid(pid1,&st,0);
    	printf("%d: terminato stato %d\n",pt,WEXITSTATUS(st));
    	pt=waitpid(pid2,&st,0);
    	printf("%d: terminato stato %d\n",pt,WEXITSTATUS(st));
    	_exit(0);
    }
    spero che qualche anima pia sia in grado di aiutarmi!!

  2. #2
    Nessuno sa rispondermi? Eppure non mi sembra di aver chiesto una cosa cosi complicata, è solo un esercizio che chi ha dato il prof di sistemi operativi...

  3. #3
    sapete almeno dove potrei chiedere?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.