Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Kylix e API Linux: Introduzione a Libc.pas

        Scritto: Giansante Gabriele, 2002     

Molte delle operazioni piu' comuni in Linux, come il montaggio dei dispositivi, l'utilizzo di socket, ecc., vengono eseguite con comandi che usano la "GNU C Library", ovvero una libreria presente in Linux.
In /usr/include sono presenti le interfacce di questa libreria per il C (headers).

Uno dei punti di forza di Kylix e' la capacita' di interfacciarsi con le librerie Linux, in modo da espandersi, importando funzionalita' non presenti normalmente.

Libc.pas e' una "Unit" Object Pascal con le dichiarazioni necessarie ad usare la GNU C Library nei programmi sviluppati con Kylix.
Supponendo di aver installato Kylix nella nostra home directory, il percorso di questa Unit e'
  ~/kylix/source/rtl/linux/Libc.pas
N.B. "~" significa "la nostra home directory".

Il file e' molto grande, quasi 900 Kbyte, quindi, per caricarlo nell'editor ci vorra' un po' di tempo.
Pubblicita'
Proviamo ad aprirlo (File->Open->...). Nel "Code Explorer" si puo' notare l'ampio numero di procedure (in Object Pascal chiamiamo procedure sia le procedure vere e proprie, sia le function), tipi, variabili e costanti disponibili.
Provando a selezionare una funzione, si puo' notare come ogni procedura venga dichiarata come "external", ovvero come appartenente ad una libreria esterna.

Purtroppo, proprio per la natura non "interna" di queste procedure, la documentazione non e' presente in Kylix, rendendo a volte difficile il loro utilizzo. Le spiegazioni necessarie, pero', non sono del tutto assenti.
Dove non arriva il fornitissimo help di Kylix, arriva il manuale Linux ("man").
Infatti, in generale, il manuale Linux contiene anche le pagine relative a molte funzioni C della GNU C Library. Basandosi su questo fatto, Kylix apre proprio il manuale Linux se riesce a trovare una voce associata alla nostra chiave di ricerca. Ad esempio, posizionarsi sulla function "sigwait" (gestione segnali nei thread) all'interno dell'editor e premere il tasto F1.

Guardando proprio nella pagina del manuale aperta nell'esempio precedente, osserviamo come in realta', a differenza di quanto specificato nel file Libc.pas, le funzioni non vengano dichiarate con i parametri da passare.
La dichiarazione di "sigwait" e' la seguente:
  function sigwait; external libcmodulename name 'sigwait';
Dalla pagina del manuale, invece si ha la seguente dichiarazione:
  int sigwait(const sigset_t *set, int *sig);
Ecco quindi, come diventi difficile usare le API senza documentazione. Se mancano sia la documentazioneche la pagina del manuale, non resta da fare altro che affidarsi agli "hint", che appaiono quando si posiziona il mouse sopra ad una funzione, oppure studiarsi gli header in /usr/include.

Grazie all'esempio fatto, possiamo notare come le funzioni accettino dei parametri di tipo completamente assente in Object Pascal. Niente paura. In Libc.pas vengono anche dichiarati tutti i tipi necessari all'utilizzo delle procedure in esso contenute.
Prendiamo "sigset_t". Nel "Code Explorer", aprendo il ramo dei tipi, riusciamo a trovare anche "sigset_t". Un discorso simile vale per le costanti da usare in alcune funzioni C. Anche le costanti sono riprodotte con i relativi valori. Guardiamo un'altra funzione, ovvero "getprotobyname". La dichiarazione C, come letto dal manuale e'
  struct protoent *getprotobyname(const char *name);
Nella dichiarazione si ha un puntatore a "protoent" ("*getprotobyname").
Come convenzione, i puntatori, in Object Pascal, vengono indicati anteponendo una "P" al nome del tipo associato. La Unit Libc.pas non fa eccezione.
Scorrendo i tipi disponibili, troviamo sia "protoent" che "PProtoent".
  protoent = {packed} record
    p_name: PChar;
    p_aliases: ^PChar;
    p_proto: u_short;
  end;
  {$EXTERNALSYM protoent}
  TProtoEnt = protoent;
  PProtoEnt = ^TProtoEnt;
Secondo la modalita' di utilizzo di "getprotobyname", ottenibile passando con il cursore sopra il nome della funzione ed aspettando pochi secondi, il tipo di uscita e' PProtoEnt, cioe' il puntatore:
  function getprotobyname(name: PChar): PProtoEnt;
Tornando al primo esempio, "sigwait", abbiamo ancora due puntatori. Leggendo l'"hint", si ottiene un risultato un po' diverso da quanto possiamo aspettarci leggendo il manuale. L'utilizzo e' il seguente:
  function sigwait(const SigSet: __sigset_t; SigNum: PInteger): integer;
Due cose sono evidenti: il primo parametro non usa il tipo "PSigSet" ("PSigSet" e' definito fra i tipi) ma "__sigset_t", cioe' il tipo base sia per "PSigSet" che per "sigset_t". Inoltre, "PInteger" non e' definito in Libc.pas ma in Types.pas (~/kylix/source/rtl/sys/Types.pas).
In sostanza, occorre fare attenzione. Si deve guardare l'hint del comando per sapere bene quali sono i tipi di dato da usare. Il manuale, invece, e' piu' utile per la spiegazione del comando, meno per la sua sintassi.

Utilizzare le API Linux, e' estremamente semplice: basta includere la Unit Libc.pas nella clausola "uses".
  uses Libc, ...;
Una volta compiuta questa operazione, si e' pronti a sfruttare le possibilita' offerte dalle API Linux.

Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'