Individuare ed estrarre il PID di un programma
Vedremo come ottenere il PID (Process IDentifier ) del programma principale, ed il PID di un programma esterno. [Nota 1]
Indice
- 1 Ottenere il PID del programma Gambas principale
- 2 Ottenere il PID di un programma esterno al programma principale Gambas
- 2.1 Caso in cui il programma esterno non sia gestito dal programma.gambas mediante process
- 2.1.1 Soluzioni con il solo uso delle funzioni di Gambas
- 2.1.1.1 Uso della Classe Desktop del Componente gb.desktop e della Classe X11 del Componente gb.desktop.x11
- 2.1.1.2 Uso della Classe DesktopWindow del Componente gb.desktop e della Classe X11 del Componente gb.desktop.x11
- 2.1.1.3 Cercare il PID nel percorso /proc/, partendo dal nome del processo del programma
- 2.1.1.4 Cercare il PID nel percorso /proc/, partendo dal titolo della finestra del programma
- 2.1.2 Soluzioni con comandi bash:
- 2.1.1 Soluzioni con il solo uso delle funzioni di Gambas
- 2.2 Caso in cui il programma esterno sia stato lanciato dal nostro programma.gambas e sia gestito mediante Process
- 2.3 Utilizzo delle funzioni esterne del API di X11
- 2.1 Caso in cui il programma esterno non sia gestito dal programma.gambas mediante process
- 3 Note
Ottenere il PID del programma Gambas principale
Si potrà ottenere il PID del programma Gambas principale attivo mediante la proprietà specifica di Gambas:
Application.Handle
oppure quella analoga:
Application.Id
Ottenere il PID di un programma esterno al programma principale Gambas
Per individuare e raccolgiere il PID di un programma esterno a quello Gambas principale, si potranno adottare diverse modalità in base ai casi:
Caso in cui il programma esterno non sia gestito dal programma.gambas mediante process
Soluzioni con il solo uso delle funzioni di Gambas
Uso della Classe Desktop del Componente gb.desktop e della Classe X11 del Componente gb.desktop.x11
Questa prima modalità mostrata richiede siano attivati i Componenti gb.desktop e gb.desktop.x11, dei quali saranno utilizzati rispettivamente il Metodo "Desktop.FindWindow()", per ottenere l'ID della finestra del programma esterno al programma principale Gambas, e il Metodo "X11.GetWindowProperty()", per ottenere dunque l'identificativo del processo (PID) del programma esterno al programma principale Gambas.
Mostriamo un esempio pratico:
Public Sub Button1_Click() Dim wid As Integer Dim pid As Integer[] ' Otteniamo innanzitutto l'identificativo della finestra del programma esterno: wid = Desktop.FindWindow("Calcolatric*", Null, Null)[0] Print Hex(wid) ' Quindi otteniamo il PID del processo del programma esterno: pid = X11.GetWindowProperty(wid, "_NET_WM_PID") Print pid[0] End
Uso della Classe DesktopWindow del Componente gb.desktop e della Classe X11 del Componente gb.desktop.x11
Poniamo il caso in cui desideriamo individuare il PID delprogramma della "Calcolatrice" di "Gnome", del quale il nome del file eseguibile è "gnome-calculator".
Public Sub Button1_Click() Dim dw As DesktopWindow Dim pid As Integer[] dw = New DesktopWindow(Desktop.FindWindow(Null, Null, "gnome-calculator")[0]) pid = X11.GetWindowProperty(dw.Id, "_NET_WM_PID") Print pid[0] End
Cercare il PID nel percorso /proc/, partendo dal nome del processo del programma
Public Sub Button1_Click() Dim cartella, comm As String For Each cartella In Dir("/proc", Null, gb.Directory) If Exist("/proc/" & cartella & "/comm") Then comm = File.Load("/proc/" & cartella & "/comm") ' Mostra il numero del PID del programma: If comm Begins "nome_processo_programma" Then Print cartella Endif Next End
Cercare il PID nel percorso /proc/, partendo dal titolo della finestra del programma
Public Sub Button1_Click() Dim s1, s2, pid As String s1 = InputBox("Inserire il titolo della finestra del programma:") [Nota 2] For Each pid In Dir("/proc") If Exist("/proc/" & pid & "/cmdline") Then s2 = File.Load("/proc/" & pid & "/cmdline") If s2 Like "*" & s1 & "*" Then ' Mostra il PID del programma: TextLabel1.Text = pid Break Endif Endif Next End
Soluzioni con comandi bash:
mediante uso di: pgrep -f nome_programma
Public Sub Button1_Click() Dim index As String Dim sotto$ As String[] ' Ottiene il PID dei processo (programma) aperto: Shell "pgrep -f nome_programma"] To index ' La variabile index sarà composta da due righe, contenenti caratteri numerali e separate da un ritorno a capo. ' Le andrà a distinguere in due sotto-stringhe distinte: sotto$ = Split(Trim$(index), "\n") ' Poiché la prima parola, restituita da "pgrep", è proprio il numero del PID del programma, va a leggere la prima sotto-stringa dell'array. Qui è contenuto il PID del programma: Print sotto$[0] End
mediante uso di: ps
Public Sub Button1_Click() Dim s1, s2As String Dim ss As String[] Shell "ps -C \"nome_del_programma\"" To s1 s2 = Replace(s1, "\n", " ") ss = Split(s2, " ", "", True) ' Mostra il nome del programma lanciato ed il suo PID: Print ss[ss.max]; " = "; ss[4] End
Caso in cui il programma esterno sia stato lanciato dal nostro programma.gambas e sia gestito mediante Process
Private hp As Process Private pid As Integer Public Sub Button1_Click() hp = Shell "nome_programma" ' Individua il numero del PID, che sarà uguale al valore di .Id + 1 : [Nota 3] pid = hp.Id + 1 Print pid End
Utilizzo delle funzioni esterne del API di X11
Infine, per individuare il PID di un programma, sia di quello Gambas principale che di altro esterno, si potrà fare uso delle funzioni della libreria X11.
Per analogia di argomento rinviamo a questa pagina della WIKI.
Note
[1] Attenzione ! L'intento è quello di ottenere il PID del programma in quanto processo, non l'ID della finestra del programma !
[2] Poiché spesso il titolo della finestra non coincide esattamente con il nome del processo del programma, si avrà cura di inserire solo alcuni caratteri del titolo, che richiama il nome del programma, successivi al primo del titolo medesimo. Esempio, se il titolo della finestra fosse: TitoloFinestra, scriveremo: "itol".
[3] Il numero del PID, ottenuto con la Proprietà ".Id" di Process, di un programma esterno gestito mediante "process", è uguale al numero del PID + 1. Questo perché il processo figlio assume un numero di PID successivo a quello del processo padre (in questo caso della Shell). In tal caso il valore restituito dalla Proprietà ".Id" della Classe Process rappresenta in realtà il numero del PID della Shell.