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 ??
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
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
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.