PDA

View Full Version : [C] Portabilita' Linux - Mac OS X (BSD?)


Gica78R
12-07-2005, 11:22
Ciao a tutti!

Sto realizzando un'applicazione che necessita di fare uso dei semafori per la sincronizzazione dei processi, quindi nei miei sorgenti includo gli header sys/ipc.h e sys/sem.h. Per operare sui semafori si usa la funzione semctl(), che tra i suoi argomenti prevede una variabile di tipo union semun. Nelle glibc, in sem.h, tale union non e' definita esplicitamente, quindi va ridefinita nei sorgenti dell'applicazione, contrariamente a quanto accade nel sem.h che trovo nelle librerie di Mac OS X (libc?). Compilando sotto Linux, ricevo un warning che mi dice che se utilizzo sys/ipc.h devo definire anche la macro _SVID_SOURCE oppure _XOPEN_SOURCE. Compilando in ambiente Mac, ottengo un errore sulla ridefinizione della union semun (poiche' e' gia' definita in sem.h), a meno di non definire la macro _POSIX_C_SOURCE. Cosa devo fare per fare in modo che la compilazione vada a buon fine in entrambi gli ambienti? Devo usare le direttive condizionali al preprocessore? E tali direttive le devo mettere solo in quei files che includono ipc.h e sem.h?
Oppure la cosa si puo' risolvere utilizzando opportune opzioni del compilatore (nel qual caso mi si complicherebbe il Makefile)?

Spero di essermi spiegato chiaramente... :)


Grazie,
Gica

Correzione: prima avevo scritto 'semop()' al posto di 'semctl()'; la funzione giusta e' quest'ultima... :)

Fenomeno85
12-07-2005, 14:58
potresti utilizzare #ifdef su tutte le parti di codice che deve essere eseguite da uno piuttosto che dall'altro

~§~ Sempre E Solo Lei ~§~

Gica78R
12-07-2005, 16:21
potresti utilizzare #ifdef su tutte le parti di codice che deve essere eseguite da uno piuttosto che dall'altro

~§~ Sempre E Solo Lei ~§~
Ma secondo te e' corretto fare una cosa del genere? #ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 1
#endif
o e' sbagliato assegnare quell' 1? Cosi' facendo, compila anche su OS X, ma mi sa che non e' una gran finezza...
Nell'header sys/sem.h che trovo nelle lib di OS X si usa la condizione #ifndef _POSIX_C_SOURCE
.......
[definizione della union semun]
.......
#endif per questioni di retrocompatibilita', mentre ora la definizione di quella union va inserita nel codice dell'applicazione.
Nello stesso header che c'e' nelle glibc (in realta' in bits/sem.h, incluso da sys/sem.h), invece, tale definizione e' commentata, con la raccomandazione di definire la union nel proprio sorgente...

ilsensine
12-07-2005, 16:51
Compilando sotto Linux, ricevo un warning che mi dice che se utilizzo sys/ipc.h devo definire anche la macro _SVID_SOURCE oppure _XOPEN_SOURCE. Compilando in ambiente Mac, ottengo un errore sulla ridefinizione della union semun (poiche' e' gia' definita in sem.h), a meno di non definire la macro _POSIX_C_SOURCE. Cosa devo fare per fare in modo che la compilazione vada a buon fine in entrambi gli ambienti?
La saga degli standard. Prova a compilare definendo unicamente _GNU_SOURCE.

Fenomeno85
12-07-2005, 17:12
prova con


#ifdef MAC
//codice MAC
#endif
#ifndef MAC
//codice LINUX
#endif



~§~ Sempre E Solo Lei ~§~

Gica78R
12-07-2005, 19:24
La saga degli standard. Prova a compilare definendo unicamente _GNU_SOURCE.
Su Linux funziona, su Mac c' e' sempre il problema che la union semun viene dichiarata due volte... C'e' proprio bisogno di usare _POSIX_C_SOURCE.
Magari inserisco la definizione della union in un blocco condizionale su _POSIX_C_SOURCE, tipo:#ifdef _POSIX_C_SOURCE
union semun
{
......
......
}
#endif
Cosi' funziona su entrambi i sistemi, ma non so se e' una soluzione "regolare" :wtf:

@Fenomeno85
Se ci fosse modo (e credo ci sia, ma io non lo conosco :( ) di sapere su quale sistema si sta compilando, potrei fare come hai detto tu. O funziona semplicemente usando MAC?

ilsensine
13-07-2005, 07:08
Su Linux funziona, su Mac c' e' sempre il problema che la union semun viene dichiarata due volte... C'e' proprio bisogno di usare _POSIX_C_SOURCE.
_GNU_SOURCE sotto linux abilita automaticamente tutta una serie di standard. E' stata fatta proprio per non impazzire con le varie definizioni. Evidentemente sotto Mac non si ha una fortuna analoga.

Se ci fosse modo (e credo ci sia, ma io non lo conosco :( ) di sapere su quale sistema si sta compilando
#ifdef __linux__
...
#else
...
#endif

Gica78R
14-07-2005, 10:09
Alla fine, per il problema della definizione della union semun ho risolto cosi'

#ifdef _SEM_SEMUN_UNDEFINED
[definizione della union]
#endif
e funziona. Poi ho provato a ricompilare omettendo anche _GNU_SOURCE e, stranamente, non mi da' piu' il warning relativo a _SVID_SOURCE e _XOPEN_SOURCE :confused: Ora questo avviso compare solo (giustamente) compilando con l'opzione -ansi :eh:
Mah!

@ilsensine: ma quando dici definire _GNU_SOURCE intendi#define _GNU_SOURCE 1 o soltanto #define _GNU_SOURCE ?
Voglio dire, ha senso fare una #define senza un numerale?
(la parte delle direttive al preprocessore e' ancora poco chiara per me :( )

ilsensine
14-07-2005, 10:40
Basta la definizione semplice. Io normalmente metto -D_GNU_SOURCE tra i CPPFLAGS.
Alcune verisoni di gcc lo definiscono automaticamente.