[RISOLTO] [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

[RISOLTO] [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

Salve. Il codice deve fare questo:

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 :D ) 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);
}
file p3

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);
	}
}
Ultima modifica di ivan p il sabato 29 marzo 2014, 17:41, modificato 1 volta in totale.
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

up
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

up :(
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da difesaparcosempione »

da che exit passa P3, che errori becca o rimane sospeso?
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

Scusami ma non capisco che vuol dire da che exit passa... Comunque non ricevo nessun errore semplicemente p3 non stampa nulla a video.
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da difesaparcosempione »

msgrcv non dovresti dare &a ( tutta la struttura ) se ben ricordo. Prova a guardare la man page...
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

Ricordi bene, ho corretto l'errore sia nella msgrcv che nella msgsnd. Però sbaglio qualcos'altro, forse nel lanciare gli eseguibili da terminale. Eseguo il file con la pipe ed inserisco i dati. Poi devo lanciare l'altro eseguibile ripetutamente per stampare tutti i messaggi.
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

Ho modificato nel seguente modo ma l'output delle ultime 2 stampe è sporco :( In oltre il processo non termina.

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;

	while(1)
	if(msgrcv(msgid,(void *)&a, BUFSIZ, 0,0)==-1)
	{
			printf("Fallito msgrcv con errore %d\n");
			exit(EXIT_FAILURE);
	}
	else 
	{
		printf("%s\n",a.mtext);
		fflush(stdout);
	}

	if(msgctl(msgid,IPC_RMID,0)==-1) 
	{ 
		printf("msgctl fallito\n");
		exit(EXIT_FAILURE);
	}
}
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

up
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

up
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ixamit »

Per la sporcizia questa modifica:

Codice: Seleziona tutto

                  
                  if(msgsnd(msgid,(struct msgbuf *)&a,strlen(buffer)+1,0)==-1)
                  {
                     printf("msgsnd fallita");
                     exit(EXIT_FAILURE);
                  }

Per la chiusura (il compilatore non si lamentava di niente?):

Codice: Seleziona tutto

               while((num_bytes = read(fpipe[0], buffer, BUFSIZ)) != 0) 
Poi ci sarebbe una fflush(stdin) da togliere, un buffer con BUFSIZ in out by one...
ivan p
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 563
Iscrizione: lunedì 2 giugno 2008, 12:05

Re: [C] Ricevo con PIPE e spedisco con MESSAGE QUEUE

Messaggio da ivan p »

Mi scuso per il ritardo... GRAZIE ixamit. Metto risolto nel post
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti