regista (H.Ellis): Tu.
Hrundi V.Bakshi (P.Sellers): Io?
regista: Sì, tu. Scendi dal mio set ed esci dalla mia foto. Spegni, spegni! Sei finito, hai finito! Farò in modo che tu non faccia mai più un altro film!
Hrundi V.Bakshi: Include la televisione, signore?
Nel bellissimo film The Party (Hollywood Party in Italia) il gran Peter Sellers si intrufola (da invitato per sbaglio) in un party del jet set hollywoodiano, e scombussola un po' l'ambiente... Ecco, il tema di questo articolo si riferisce a un sistema di IPC (inter-process communication) che si è intrufolato un po' tardi (nel 2003) nel mondo IPC, quando già ne esistevano mille tipi ben consolidati, eppure si è fatto strada e oggi è usatissimo. Preparatevi, in questo articolo (e nei prossimi) parleremo di D-Bus!
![]() |
| ...ma da dove è arrivato 'sto D-Bus?... |
Visto che l'argomento è vasto questo sarà il primo articolo di una serie, e per introdurre l'argomento mi sembra il caso di iniziare con:
Un po' di storia...
D-Bus (Desktop Bus) è un sistema di comunicazione tra processi (IPC) utilizzato principalmente in ambienti Linux e Unix-like (e quindi POSIX). È stato sviluppato da Red Hat e dalla community freedesktop.org per offrire alle applicazioni un modo semplice e standardizzato per scambiarsi messaggi e servizi senza bisogno di supportarsi direttamente tra loro. E, come dice il nome stesso, è un sistema nato per facilitare la comunicazione tra le applicazioni dello stesso desktop (ambiente grafico) e tra l'ambiente desktop e il sistema operativo. Interessante, no?
D-Bus si basa su un daemon (un demone Unix, un classico) che gestisce il traffico dei messaggi e permette:
- La comunicazione tra applicazioni dello stesso ambiente desktop (Session Bus).
- La comunicazione tra il sistema operativo e l'ambiente desktop o tra processi di sistema (System Bus).
L'architettura di D-Bus è strutturata su tre livelli: la libreria di base libdbus, il daemon di gestione dei messaggi e le librerie wrapper specifiche per diversi ambienti applicativi, facilitando l'integrazione e la gestione del ciclo di vita dei processi in modo affidabile. E aggiungo un ultimo dettaglio: anche se D-Bus è basato nativamente, come visto sopra, su un daemon, è comunque anche un IPC classico, e quindi supporta la connessione diretta (peer-to-peer) che non usa il daemon: ma questa opzione si usa solo per casi particolari.
Ah, prima che mi dimentico: D-Bus è anche multi-piattaforma, quindi è disponibile (ma poco usato) anche in quel sistema operativo che comincia con W e che, di solito, preferisco non nominare nemmeno (ah ah ah).
E come si scrive il codice C per usare D-Bus?
Ecco, or incomincian le dolenti note: la libreria base storica, quella nata insieme al protocollo è la libdbus: è una libreria low-level completissima, ben fatta, super-testata e ben funzionante ma... praticamente inutilizzabile (ah ah ah) perché criptica e complicatissima da usare così com'è. Infatti, nella documentazione ufficiale di freedesktop.org se ne sconsiglia l'uso!
e lo stesso consiglio si trova in altre fonti, tra qui questa:
“NOTA: si sconsiglia di utilizzare questa API a meno che non sia assolutamente necessario.Gli sviluppatori di applicazioni dovrebbero utilizzare uno dei binding, se possibile. Se siscrive in in C, si consigliano i binding GLib.” [cit. Matthew Johnson - Using the DBUS C API]
E allora che si fa?
Rimanendo sul C si potrebbe/dovrebbe usare uno dei wrapper disponibili, ad esempio GDBus, ma questo è molto legato all'ambiente grafico GNOME/GTK, quindi volendo scrivere del Software un po' più generico (è il nostro caso) non è adatto. Oppure si potrebbero usare i wrapper in C++ (ehm...): ad esempio QtDBus, ma per questo valgono le stesse considerazioni fatte per GDBus (e in questo caso si dipenderebbe da Qt). Oppure usare dbus-c++, che è, effettivamente, un buon wrapper diretto di libdbus: facilita molto la scrittura del codice, ma è un po' obsoleto e credo che non sia più un progetto attivo. E poi, la domanda iniziale era: "E come si scrive il codice C per usare D-Bus?" Quindi dimentichiamoci del C++ (bene! Anzi, benissimo!).
Ripetiamo: "E allora che si fa?" La risposta sarà nel prossimo articolo! Lì vedremo l'evoluzione Software che ha avuto il nostro D-Bus e le nuove librerie disponibili (in C!).
Comunque non posso terminare un articolo senza codice, no? Quindi ho scritto due applicazioni in C (un Server e un Client) funzionanti (parlano tra loro) e che usano libdbus. Vai col codice! Prima il Server:
E poi il Client:
Che ve ne pare? Come al solito è tutto stra-commentato, quindi non c'è bisogno di aggiungere molti dettagli: la struttura del codice è, più o meno, simile a quella dei classici Socket Server e Client come quelli che ho già mostrato qui e qui... ma il problema è che il risultato finale è molto più complicato! È codice abbastanza incomprensibile, ed è l'esempio più semplice che mi è venuto in mente! Direi che le citazioni che ho fatto sopra sono veritiere!
Ah, se non vi fidate e volete volete vedere se funziona veramente, vi passo le linee di installazione della libreria (su Linux) e delle compilazioni di Server e Client:
sudo apt install libdbus-1-devgcc -Wall -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -o server server.c -ldbus-1gcc -Wall -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -o client client.c -ldbus-1
dopodiché, se eseguite i due programmi in terminali separati vedrete la magia dello scambio di messaggi (interattivo) tra Client e Server. Provare per credere!
Ok, per oggi può bastare. Nel prossimo articolo vi parlerò, come anticipato sopra, del D-Bus con le librerie C! Restate sintonizzati!
Ciao, e al prossimo post!
P.S.
Ricordatevi di visitare il mio nuovissimo cineblog! Lo trovate qui: Polvere di Cinema. Buona lettura!


