PDA

View Full Version : [c]non mi vengono gli es qualcuno mi da una mano please??


maradona86
21-11-2007, 09:52
#include <stdio.h>



main()
{int fdes1[2];int fdes2[2];
int pid;
int i=1;
int j=1;
char buffer1[5];
char buffer2[6];
pipe(fdes1); /*creating first pipe*/
pipe(fdes2); /* second pipe */

pid = fork();

if (pid==0){ /*child */
close(fdes1[1]);
close(fdes2[0]);

while(i!=0){
i=read(fdes1[0], buffer1,5);
printf("%d characters received by child= ",i);
buffer1[i]='\0';
printf("%s\n",buffer1);
}
close(fdes1[0]);

sleep(1);

write(fdes2[1],"Ciao, Papa!",sizeof("Ciao, Papa!"));





}

if (pid!=0) { /* in parent */
close(fdes1[0]);
close(fdes2[1]);
write(fdes1[1],"Ciao, Bambino!",sizeof("Ciao, Bambino!"));
close(fdes1[1]);


while(j!=0){
j=read(fdes2[0], buffer2,6);
printf("%d characters received by father= ",j);
buffer2[j]='\0';
printf("%s\n",buffer2);
}



}
}

questo è il mio codice che avevo implementato a lezione..come potrei fare a creare 3 processi figli P1,P2,P3 e pipes tra processi in modo che P1 scrive un messaggio a P2 che lo passa a P3 che lo ripassa a P1 e cosi via e Ogni volta che P1 riceve il messaggio lo cambia ??

cionci
21-11-2007, 10:40
Vedo che non ti sei impegnato molto con l'indentazione :D
Indentalo ed avrai più risposte...compresa la mia ;)
Inseriscilo nel tag {CODE}{/CODE} con le parente quadre al posto delle graffe.

maradona86
21-11-2007, 18:59
#include <stdio.h>



main()
{int fdes1[2];int fdes2[2];
int pid;
int i=1;
int j=1;
char buffer1[5];
char buffer2[6];
pipe(fdes1); /*creating first pipe*/
pipe(fdes2); /* second pipe */

pid = fork();

if (pid==0){ /*child */
close(fdes1[1]);
close(fdes2[0]);

while(i!=0){
i=read(fdes1[0], buffer1,5);
printf("%d characters received by child= ",i);
buffer1[i]='\0';
printf("%s\n",buffer1);
}
close(fdes1[0]);

sleep(1);

write(fdes2[1],"Ciao, Papa!",sizeof("Ciao, Papa!"));





}

if (pid!=0) { /* in parent */
close(fdes1[0]);
close(fdes2[1]);
write(fdes1[1],"Ciao, Bambino!",sizeof("Ciao, Bambino!"));
close(fdes1[1]);


while(j!=0){
j=read(fdes2[0], buffer2,6);
printf("%d characters received by father= ",j);
buffer2[j]='\0';
printf("%s\n",buffer2);
}



}
}


ok so che facendo il fork creo processi identici ma non so bene come farlo...
scusate per prima :)
ciauz a tutti buona serata

cionci
21-11-2007, 20:15
Questa è una indentazione ;)

#include <stdio.h>



main()
{
int fdes1[2];
int fdes2[2];
int pid;
int i = 1;
int j = 1;
char buffer1[5];
char buffer2[6];
pipe(fdes1); /* creating first pipe */
pipe(fdes2); /* second pipe */

pid = fork();

if (pid == 0) { /* child */
close(fdes1[1]);
close(fdes2[0]);

while (i != 0) {
i = read(fdes1[0], buffer1, 5);
printf("%d characters received by child= ", i);
buffer1[i] = '\0';
printf("%s\n", buffer1);
}
close(fdes1[0]);

sleep(1);

write(fdes2[1], "Ciao, Papa!", sizeof("Ciao, Papa!"));





}

if (pid != 0) { /* in parent */
close(fdes1[0]);
close(fdes2[1]);
write(fdes1[1], "Ciao, Bambino!", sizeof("Ciao, Bambino!"));
close(fdes1[1]);


while (j != 0) {
j = read(fdes2[0], buffer2, 6);
printf("%d characters received by father= ", j);
buffer2[j] = '\0';
printf("%s\n", buffer2);
}



}
}
Prima di tutto devi fare due firk se devi operare con 3 processi.
Il processo A deve condividere con il processo B una pipe.
Il processo B deve condividere con il processo C una pipe.
Quindi: A crea una pipe e fa la fork creando B. A chiude la pipe in ricezione, B quella in invio.
B crea una pipe e fa la fork creando C. C chiude la pipe in ricezione con A (resta aperta anche quella) e la pipe in invio verso B. B chiude quella in ricezione verso C.

A questo punto B non deve fare altro che inviare ogni carattere che riceve da A sulla pipe verso C.
A scrive sulla pipe e C legge.

maradona86
26-11-2007, 15:23
#include <stdio.h>



main()

{

int fdes [2]; // prima pipe

int fdes2[2]; // seconda pipe

int fdes3[2]; // terza pipe

int pid; // usato per fare fork

int pid2; // usato per fare fork

int pid3; // usato per fare fork

char buffer1[5]; // buffer tra processi

char buffer2[6]; // buffer tra processi

char buffer3[7]; // buffer tra processi

pipe(fdes); // creazione prima pipe

pipe(fdes2); // creazione seconda pipe

pipe(fdes3); // creazione terza pipe

char *messaggio = "sis" // messaggio da inviare tra processi

char singolo; // singolo carattere

i = 0;

pid=fork(); // processo A

if(pid != 0) // sono nel padre

{

wait(); // aspetto che A finisce

close(fdes[1]); // chiudo in scrittura la prima pipe

for (i=0;singolo!='\0';i++)

{

singolo=read(fdes[0],1,sizeof(char));

buffer1[i]=singolo;

}

open(fdes[1]); // apro in scrittura fdes

pid2=fork(); // genero il processo B

if(pid2 != 0) // sono ancora nel padre

{

wait(); // aspetto che B finisce

close(fdes2[1]); // chiudo in scrittura fdes2

for(i=0;singolo!='\0';i++)

{

singolo=read(fdes2[0],1,sizeof(char));

buffer2[i]=singolo;

}

open(fdes2[1]); // riapro in scrittura BC

pid3=fork(); // genero il processo C

if(pid3 != 0) // sono ancora nel padre

{

wait(); // aspetto che il processo C finisca

close (fdes3[1]); // chiudo in scrittura CA

for(i=0;singolo!='\0';i++)

{

singolo=read(fdes3[0],1,sizeof(char));

buffer3[i]=singolo;

}

open(fdes3[1]); // riapro in scrittura CA

*messaggio=*messaggio+1; // cambio il messaggio da spedire

}

else // sono nel processo C ora devo scrivere
// nella pipeCA

{

write(fdes3[1],buffer3,sizeof(buffer3));

}

}

else // sono nel processo B ora devo scrivere
// nella pipeBC

{

write(fdes2[1],buffer2,sizeof(buffer2));

}


}

else //mi trovo nel processo A ora devo scrivere
//nella pipeAB

{

write(fdes[1],messaggio,sizeof(messaggio));

}

}



mi scuso per l indentazione.
non riesco ancora a farlo funzionare.
dove sbaglio??

DanieleC88
26-11-2007, 15:32
Uh? Eh? Cosa? :D
for (i=0;singolo!='\0';i++)
{
singolo=read(fdes[0],1,sizeof(char));
buffer1[i]=singolo;
}
Dove punta 1? Cosa stai scrivendo in buffer1[i]? :D

cionci
26-11-2007, 15:51
Se non sbaglio, visto che è un po' che non tocco le pipe...non le devi riaprire le pipe. Una volta creata è già aperta, devi solo chiudere quelle che non usi. Poi tra l'altro mancherebbero anche dei parametri alla open.