|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2012
Messaggi: 1
|
code di messaggi IPC
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. Codice:
/*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; } Codice:
/*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; } |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:12.