|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
[C] IPC con code di messaggi
[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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
MSGZ è arbitrario ed è specificato in msgsz.
Che documentazione hai letto? La mia è leggermente differente...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
Intanto grazie... io sto prendendo come riferimento questo sito
http://www.cs.cf.ac.uk/Dave/C/node25...00000000000000 Sì so che si può specificare ma quindi quale dimensione dovrei mettere? ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
E' la dimensione del messaggio che devi inviare, immagino. Nota che le strutture contenenti il messaggio, nel tuo caso, non hanno dimensione fissa.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
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?
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
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! |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
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 |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
Una precisazione... il messaggio viene ricevuto perchè nel campo sender della struct riesco a leggere il dato corretto, ma non nel campo mtext.
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Io farei così:
Codice:
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; }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Apr 2001
Messaggi: 111
|
Grazie mille... funziona tutto alla perfezione ora
![]() Ciao |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:20.