PDA

View Full Version : code di messaggi IPC


pasqualino10
12-01-2013, 07:58
Ho voluto provare a scrivere un programma banale, anzi due, per leggere e scrivere rispettivamente da una coda di messaggi ripetutamente.
IL problema è che non riesce a leggere dalla coda di messagi ma solo ad inviare e scrivere messaggi su di essa.
Posto qui i due programmi:
il primo legge dallo standard input e scrive e salva i valori sulla coda di messaggi, il secondo programma in pratica dovrebbe soltanto leggere i valori dalla coda di messaggi e stamparli su stdout.
Provate ad eseguirli e vedete se riuscite a capire il problema.


/*devo realizzare una coda di messaggi IPC
attraverso la quale due programmi si scambiano
ripetutamente messaggi*/
/*Questo è quello che scrive sulla coda di
messaggi i valori letti da tastiera(stdin)*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<errno.h>
struct msgbuf{
long mtype;
int value;
};
void send_on_queue(long v, int mq_id)
{
/*invia la riga letta da linea di comando
direttamente sulla coda di messaggi in
modo che possa subito essere letta da qualcun altro*/
struct msgbuf msg;
msg.mtype = 1;
msg.value = v;
if(msgsnd(mq_id,&msg,sizeof(long),0) == -1){
perror("in msgsnd");
exit(EXIT_FAILURE);
}
}
long read_value()
{
errno = 0;
long num;
char buf[32];
/*legge un'intera riga da terminale fino al
carattere newline tramite la fgets*/
if(fgets(buf,32,stdin) == NULL){
perror("in fgets");
exit(EXIT_FAILURE);
}
char *end_ptr;
num = strtol(buf,&end_ptr,10);
/*if(errno != 0 || *end_ptr != '\0'){
perror("in strtol");
exit(EXIT_FAILURE);
}
*/
/*una volta che ho letto il valore posso
inviarlo sulla coda di messaggi*/
return num;
}
int open_queue_messages(void)
{
key_t key;
int qid;
/*prima creiamo la chiave*/
key = ftok(".",'a');
if(key == -1){
perror("in ftok");
exit(EXIT_FAILURE);
}
/*ora devo aprire la coda di messaggi e ottenere
l'identificatore per essa(un intero)*/
qid = msgget(key,IPC_CREAT | 0666);
if(qid == -1){
perror("in msgget");
exit(EXIT_FAILURE);
}
return qid;
}
int main(int argc, char *argv[])
{
if(argc != 1){
fprintf(stderr,"Usage only the argument : %s ",argv[0]);
return EXIT_FAILURE;
}
/*ovviamente la coda di messaggi dovrà avere
la stessa chiave anche nell'altro programma*/
int q_id;/*identificatore coda di messaggi*/
q_id = open_queue_messages();
/*legge continuamente da standard input
e continuamente scrive i valori sulla
coda di messaggi(li invia con msgsnd)*/
long val;
for(;;){
val = read_value();
send_on_queue(val,q_id);
}

return EXIT_SUCCESS;
}




/*quest'altro programma ha il compito di
ricevere messaggi dalla coda di messaggi, i
quali sono inviati dall'altro programma.*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<unistd.h>
struct msgbuf{
long mtype;
long value;
};
long read_from_queue(int id)
{
struct msgbuf msg;
if(msgrcv(id,&msg,sizeof(long),0,0) != sizeof(long)){
perror("in msgrcv");
exit(EXIT_FAILURE);
}

return msg.value; /* ho ricevuto un messaggio */
}
int open_queue_messages(void)
{
key_t key;
int qid;
/*prima creiamo la chiave*/
key = ftok(".",'a');
if(key == -1){
perror("in ftok");
exit(EXIT_FAILURE);
}
/*ora devo aprire la coda di messaggi e ottenere
l'identificatore per essa(un intero)*/
qid = msgget(key,IPC_CREAT | 0666);
if(qid == -1){
perror("in msgget");
exit(EXIT_FAILURE);
}
return qid;
}
int main(int argc, char *argv[])
{
if(argc != 1){
fprintf(stderr,"Usage only argument : %s ",argv[0]);
return EXIT_FAILURE;
}
int q_id;/*identificatore coda di messaggi*/
q_id = open_queue_messages();
long value;
for(;;){
value = read_from_queue(q_id);
printf("Ho letto il numero %ld \n",value);

}
return EXIT_SUCCESS;
}