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
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);
}
}
