Newsgroup: it.comp.os.linux.development
Titolo: union semun

Sto dando un'occhiata ai Semafori Binari di Linux e mi ritrovo con il
seguente esempio:
....
int
main(int argc,char **argv) {
    int z;                  /* Return code */
    int x;                  /* Work index */
    time_t t0;              /* Start time */
    union semun semarg;     /* semctl() arg */ (<=== Riga Incriminata)
    /* Initial counts of tools in toolbox: */
....
    /*
     * Initialize the semaphore counts :
     */
    semarg.array = icounts;
    z = semctl(semid,0,SETALL,semarg);
    if ( z == -1 ) {
        perror("semctl(SETALL)");
        exit(1);
    }
....
***
Compilando il sorgente contenente le istruzioni sopra ottengo il
seguente errore:
[uda@udasoftware chap19]$ gcc -o 19LST01 19LST01.c
19LST01.c: In function `main':
19LST01.c:221: storage size of `semarg' isn't known
***
Conosco poco e niente il C (ho sempre usato C++) e non riesco a capire a
cosa sia dovuto l'errore o cmq come devo modificare il codice; accetto
aiuto (8-)
Ciao, U D A.

 
Come documentato nella manpage di semctl, la definizione di union semun
deve essere fornita dall'utente.
Questo commento è tratto da sys/sem.h.
 /* 
   The user should define a union like the following to use it for
   arguments for `semctl'.
   union semun
   {
     int val;  <= value for SETVAL
     struct semid_ds *buf;  <= buffer for IPC_STAT & IPC_SET
     unsigned short int *array;  <= array for GETALL & SETALL
     struct seminfo *__buf;  <= buffer for IPC_INFO
   };
   Previous versions of this file used to define this union but this is
   incorrect.  One can test the macro _SEM_SEMUN_UNDEFINED to see whether
   one must define the union or not. 
  */
MM

19LST01.c:221: storage size of `semarg' isn't known
semctl(3) dice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
       int val;                    /* value for SETVAL */
       struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */
       unsigned short int *array;  /* array for GETALL, SETALL */
       struct seminfo *__buf;      /* buffer for IPC_INFO */
};
#endif
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 19LST01.c:221: storage size of `semarg' isn't known
Ti sei scordato uno fra
  #include <sys/ipc.h>
  #include <sys/sem.h>
+++
Non so cosa stai facendo ma ti sconsiglio di usare le primiteve di IPC
SYSV:
1) sono oltremodo complesse
2) le risorse non sono rilasciate automaticamente alla terminazione
   dei processi
3) nonostante 2, non viene usato il filesystem come interfaccia
   (percio' ad esempio per rimuovere un semaforo devi usare ipcrm, non
   un semplice rm... Bleah!)
Una migliore alternativa e' l'advisory record locking (vedi fcntl);
anche i mutex di pthread (da usarsi solo con i thread pero')
dovrebbero essere buoni, ma non li ho mai usati.
Volendo ristrutturare un po' l'applicazione, probabilmente potresti
anche utilizzare le named pipe o i socket.
Ciao,
-- 
Diego    | Per le repliche elimina dal mio indirizzo le 
Dainese  | `x' e inverti le due parole intorno alla `@'

 I'm just curious...
There was some discussion about it and I posted the shm fs patch on
lkm some weeks before.
The shm fs makes posix shm possible. The API for posix shm is much
more fitting in the Unix way then SYSV IPC. It also is much more
flexible.
In short you have the following calls for posix shm:
- shm_open gives you a file descriptor to a shm object
- you can manipulate this file descriptor with ftruncate, fstat and
  mmap like any other file descriptor
- shm_unlink removes the object
shm_open and shm_unlink directly map to open/unlink in the shm fs.
Also the internal handling fits now much better into the rest of the
mm code.
 
-- 
Lorenzo
"Given enough eyeballs, all bugs are shallow", Linus'Law
(per rispondere via email fai un rot13 dell'indirizzo)
(apply a rot13 to reply)