[so] [IPC2] msgbuf_t

Lucian Adrian Grijincu lucian.grijincu at gmail.com
Sat Apr 12 19:48:50 EEST 2008


2008/4/12 Daniel Baluta <daniel.baluta at gmail.com>:
> Salut,
>
> In laboratorul de IPC2 aveam definita structura
>
>  typedef struct msgbuf
>  {
>      long type;
>      char mtext[0];
>  } msgbuf_t;
>

Scuze, unde era definită structura asta?

Standardele care definesc modul de functionare a msgsnd, msgrcv (SVr4,
POSIX.1-2001) spun în mod explicit:

       The msgp argument is a pointer to *caller-defined* structure of the  fol‐
       lowing general form:

            struct msgbuf {
                long mtype;       /* message type, must be > 0 */
                char mtext[1];    /* message data */
            };

Nici un header sistem nu defineste structura asta pentru a nu obliga
programatorii care o vor folosi să recurgă la trucuri speciale ca
malloc(sizeof(struct msgbuf) + aditional_payload) sau char mtext[0].

Singurul lucru care e cerut e ca structura să aibă minimum 4 bytes, și
dacă se interpretează acești 4B ca un «signed long int» valoarea
rezultată trebuie să fie > 0 (pentru că msgrcv cu tipul <= 0 are o
semnificație aparte).

Kernelul cere să știe dimensiunea payloadului adițional (care poate fi
zero: «The  mtext  field is an array (or other structure) whose size
is specified by msgsz, a non-negative integer value.»). Problema cu
abordarea asta e că se pierde "type checking"-ul pe care l-ar fi putut
impune un compilator C.

>
> Pentru a intelege mai bine  campul mtext cititi threadul [1] din lista de
> PSO.
>
> [1] http://cursuri.cs.pub.ro/pipermail/pso/2008-April/002288.html

Anyways, +1

-- 
Lucian


More information about the so mailing list