Newsgroup: it.comp.os.linux.development
Titolo: Macro per codice C portabile su Linux e Solaris

Ciao,
sto scrivendo un programma per un esame, e lo sto scrivendo qui a casa su
Debian, però lo dovrò far girare su Solaris. E' scritto in ANSI C quindi
non dovrei avere alcun problema, c'è solo una cosa che ancora non mi è
chiara: dal momento che i sistemi SysV e BSD hanno delle lievi differenze
per quanto riguarda la gestione dei segnali, ho pensato di inserire
all'interno del codice delle direttive in modo tale da usare un dato
codice in base al sistema operativo.
Es:
#ifdef __solaris__
  printf("Solaris\n");
#endif
#ifdef __linux__
  printf("Linuzzo\n");
#endif
Il problema è che non sono sicuro delle voci "__solaris__" e "__linux__",
dal momento che su Internet ho trovato di tutto (es: "Linux", "LINUX",
"_LINUX", "SunOS", "Solaris", "SOLARIS", ecc...).
Finora ho constatato che su Linux funziona "__linux__" (le altre non
vanno), ma vorrei capire quali sono quelle giuste (e scrivere un codice
che giri in maniera corretta anche a scuola senza farmi una figura di
m***a).
C'è una lista da qualche parte che specifichi queste definizioni in
maniera attendibile e non campata in aria?
Grazie e un saluto a tutti,
-- 
      ______________
(*)--[::::::::::::::]--(*)
(*)--[>::d1s4st3r::<]--(*)
(*)--[::::::::::::::]--(*)
(*)--[::wonder'ing::]--(*)
(*)--[::what's::::::]--(*)
(*)--[::^happening::]--(*)
(*)--[::|^::::::::::]--(*)
(*)--[__||__________]--(*)
 |......................|
http://xoomer.virgilio.it/
 +------> mental_insomnia/
(*) <-------------------+

 "_LINUX", "SunOS", "Solaris", "SOLARIS", ecc...).
Lancia il tuo compilatore su un file vuoto richiedendo la lista dei
simboli definiti per il preprocessor --- e.g.:
echo | gcc -E -dM -
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 wrote in message 
news:pan.2005.07.05....@gmail.com...

Guarda se questo link puo' esserti di aiuto:
http://predef.sourceforge.net/index.php
Fabio



Bingoooooooooooo!!!
E' subito finito nei miei bookmarks! :-PPP
Thanx!


 codice in base al sistema operativo.
Ok, ma occhio al vero significato delle cose.
Esempio: avevo del codice multipiattaforma che usava i POSIX thread.
L'implementazione che c'era su HP-UX all'epoca (si parla di parecchi anni
fa) divergeva leggermente dallo standard, per cui avevo ben pensato di
usare delle #ifdef HPUX per le chiamate ad hoc. Poi è successo che il
problema è stato corretto con una patch di sistema, e mi son ritrovato
col codice che non compilava più (era sempre HP-UX, ma ora si comportava
come gli altri).
In realtà non era significativo che il sistema fosse HP-UX, era
significativo che avesse delle chiamate che divergevano dallo standard.
Per signal(2) può anche andare bene, perché il suo comportamento su una
data piattaforma è ormai scritto nella pietra, ma per altre cose non è
detto che le prima o poi le cose ti cambino sotto i piedi...
-- 
  |   \    \  | ___|_  |_  |  ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /   Verba volant, scripta
 _|_/  _\_|  _|____|___|___|  manent, data corrupted

 signal(2) è obsoleta: usa sigaction(2) e soci, che è portabile.
eh no, signal e' ansi C.



Vero, quello che dici è giusto, ma tieni conto che tutto ciò mi serve
per un esame all'Uni e vorrei fare una roba che funziona visto che dovrò
spiegare e commentare il mio programma (oltre che farlo girare) davanti
ad una macchina Solaris.
Conta inoltre che le syscall che devo usare sono standard, e il mio
programma è in ANSI C (già provato le parti che ho scritto e funzionano
bene sia su Linux che su Solaris), il fatto è che Solaris richiede una
riga di codice in più per quanto riguarda la gestione di un segnale
SIGUSR1 con "signal(SIGUSR1, miometodo)".
Comunque signal(2) è ANSI C, mentre sigaction(2) è POSIX / SVr4.
Ciao!


 eh no, signal e' ansi C.
Il manuale presente sui fBSD dice che signal e` un'interfaccia
semplificata a sigaction.
Per sigaction specifica che e` POSIX, ma per signal non specifica nulla.
Tuttavia qui l'ho trovata come C89. 
http://www.schweikhardt.net/identifiers.html
Uhm... per quanto ricordassi io segnali e simili erano fuori dallo
standard ANSI, ma evidentemente sbagliavo.
-- 
Odio gli indifferenti, perche` mi da noia il loro 
piagnisteo di eterni innocenti. [...]
Sono Partigiano. Percio` odio chi non parteggia.
Odio gli indifferenti. (Gramsci)

 codice in base al sistema operativo.
Ciò equivale a incamminarsi sulla strada abbandonata da diversi anni
in favore dei cosiddetti "autotools": autoconf, automake e libtool. 
Forse per un esame non c'è il tempo di approfondirli, richiedono un
pò di tempo per essere digeriti, ma per chi sviluppa su Unix valgono
assolutamente la pena.
Un programma configurato usando gli autotools in genere con
   ./configure
   make
   make install
si compila e si installa. Un programma configurato a base di
#ifdef ha meno chance.
Barone Frankenstein
-- 
There is no place like /home.