PDA

View Full Version : [C] IPC con code di messaggi


opiu
01-09-2004, 13:44
[C] IPC con code di messaggi

Ciao, per un esercizio per l'università devo far comunicare vari processi attraverso code di messaggi, utilizzo le seguenti funzioni per inviare e ricevere un messaggio:

int msgsnd(int msqid, const void *msgp, size_t msgsz,
int msgflg);

int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);

e questa struttura dati per il messaggio

struct mymsg {
long mtype; /* message type */
char mtext[MSGSZ]; /* message text of length MSGSZ */
}

Tutto come da manuale insomma. Il mio problema è che inizialmente il messaggio è costituito da un solo carattere, poi però la dimensione cresce non linearmente praticamente moltiplicata sempre per sei. Avrò quindi con pochi cicli msg costutuiti da stringhe da 1,6,36,216,1296 ecc caratteri... e una struttura come char mtext[MSGZ] non è adatta giusto? E poi che valore dovrebbe assumere MSGZ? Nell esercizio non è specificato quante iterazioni devo compiere, credo il numero sufficiente per dimostrare una corretta comunicazione. Come fare considerando che la funzione msgrcv deve conoscere la dimensione del messaggio?

Grazie

ilsensine
01-09-2004, 15:52
MSGZ è arbitrario ed è specificato in msgsz.
Che documentazione hai letto? La mia è leggermente differente...

opiu
01-09-2004, 16:53
Intanto grazie... io sto prendendo come riferimento questo sito

http://www.cs.cf.ac.uk/Dave/C/node25.html#SECTION002540000000000000000

Sì so che si può specificare ma quindi quale dimensione dovrei mettere? :sofico:

ilsensine
01-09-2004, 21:09
E' la dimensione del messaggio che devi inviare, immagino. Nota che le strutture contenenti il messaggio, nel tuo caso, non hanno dimensione fissa.

opiu
01-09-2004, 23:51
Esattamente così! Il fatto è che il ricevente deve conoscere a priori la dimensione del messaggio, e il mio msg diventa dopo 4 invii di ben 1296 caratteri! Dovrei quindi avere un vettore di 1296 spazi? È forse opportuno gestire diversamente la struttura dati per il messaggio?

ilsensine
02-09-2004, 08:00
Il ricevente non deve necessariamente conoscere la dimensione del messaggio in quanto tale valore è restituito da msgrcv. Se il tuo buffer è troppo piccolo per contenere il messaggio, viene ritornato l'errore E2BIG e puoi riallocare un buffer più grande (ad es. il doppio del precedente).
Vedi man msgrcv.

opiu
02-09-2004, 10:57
mmm comincio a capire...
quindi ci sono due problemi di spazio uno della coda stessa (viene ritornato l'errore EAGAIN e posso ridimensionare la coda con msgctl aumentando il valore oltre MSGMNB che è quello predefinito dal sistema), e l'altro del msg (viene ritornato l'errore E2BIG ma posso ridimensionare il parametro msgsz e ripetere l'operazione di ricezione)

Teoricamente credo sia corretto, ora apro vim...

Grazie mille!

opiu
05-09-2004, 18:08
Ciao, mi spiace ma non sono ancora giunto alla fine... sono riuscito a far funzionare lo scambio di messaggi utilizzando come struttura del msg questa:

typedef struct msgbuf {
long mtype; /* message type */
long sender; /* message sender */
char mtext[MSGSZ]; /* message text of length MSGSZ */
} message_buf


Però in questo modo il msg è fissato nella sua dimensione e vorrei dipendesse ad esempio da un parametro di ingresso da linea di comando. Penso allora di sostituire l'ulitmo campo con un puntatore a char:

char *mtext

allocando con malloc abbastanza memoria.

Lo scambio di messaggi dovrebbe avvenire perchè con ipcs vedo che la coda è vuota, ma andando a leggere nel buf di ricezione ci sono solo strani caratteri.

Grazie

opiu
05-09-2004, 23:48
Una precisazione... il messaggio viene ricevuto perchè nel campo sender della struct riesco a leggere il dato corretto, ma non nel campo mtext.

ilsensine
06-09-2004, 08:04
Io farei così:

typedef struct msgbuf {
long mtype;
long sender;
char mtext[0];
} message_buf

(...)
struct msgbuf *alloca_messaggio(int msgsz) {
struct msgbuf *ret;
ret = malloc(sizeof(*ret)+msgsz);
return ret;
}

opiu
06-09-2004, 11:48
Grazie mille... funziona tutto alla perfezione ora :)
Ciao