un processo p1 legge una serie di nomi da un file di testo lista.txt (uno per ogni riga) e attraverso una pipe li invia al processo figlio p2. Il processo p2 per ogni nome ricevuto chiede di inserire l'età da tastiera e crea un messaggio con nome ed età che invia attraverso message queue ad un terzo processo.
La pipe funziona alla grande (grazie all'aiuto datomi in un altro post ) ma il processo p3 non stampa i messaggi ricevuti e non capisco il perchè.
file p1, p2
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
int main ()
{
int res;
int fpipe [2];
char buffer[BUFSIZ+1];
int num_bytes;
char prova[4];
int status;
int len;
FILE *f;
int msgid;
struct msgbuf {
long mtype;
char mtext[BUFSIZ];
};
memset(buffer,'\0',sizeof(buffer));
if(pipe(fpipe)== 0)
res = fork();
switch(res)
{
case -1: perror("Errore fork\n");
exit(EXIT_FAILURE);
break;
case 0: close(fpipe[1]);
while(num_bytes = read(fpipe[0], buffer, BUFSIZ) != 0)
{
printf("\nInserire l'eta' di %s", buffer);
len = strlen(buffer);
scanf("%s",&buffer[len]);
fflush(stdin);
msgid=msgget((key_t)1234,0666|IPC_CREAT);
if(msgid==-1)
{
printf("msgget fallita ");
exit(EXIT_FAILURE);
}
struct msgbuf a;
a.mtype = 1;
strcpy(a.mtext,buffer);
//printf("%s",a.mtext);
if(msgsnd(msgid,(void *)&a.mtext,strlen(buffer),0)==-1)
{
printf("msgsnd fallita");
exit(EXIT_FAILURE);
}
}
close(fpipe[0]);
exit(EXIT_SUCCESS);
break;
default: close(fpipe[0]);
if( NULL == (f = fopen("lista.txt","r")))
{
printf("Errore apertura file\n");
exit(EXIT_FAILURE);
}
else
while (fgets(buffer,BUFSIZ, f) != NULL)
num_bytes = write(fpipe[1],buffer,BUFSIZ);
close(fpipe[1]);
wait(&status);
}
exit(EXIT_SUCCESS);
}
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
int main ()
{
int msgid;
struct msgbuf {
long mtype;
char mtext[BUFSIZ];
};
msgid=msgget((key_t)1234,0666|IPC_CREAT); /*crea la message queue*/
if(msgid==-1){
printf("msgget fallita ");
exit(EXIT_FAILURE);
}
struct msgbuf a;
if(msgrcv(msgid,(void *)&a.mtext, BUFSIZ, 0,0)==-1)
{
printf("Fallito msgrcv con errore %d\n");
exit(EXIT_FAILURE);
}
else printf("%s\n",a.mtext);
if(msgctl(msgid,IPC_RMID,0)==-1)
{
printf("msgctl fallito\n");
exit(EXIT_FAILURE);
}
}