PDA

Visualizza la versione completa : [C] Esercizio con pipe e segnali


zorginho
05-09-2011, 12:34
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



#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!! :cry:

zorginho
06-09-2011, 12:22
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...

zorginho
06-09-2011, 20:27
sapete almeno dove potrei chiedere?

Loading