Differenze tra le versioni di "Individuare ed estrarre il PID di un programma"
Riga 55: | Riga 55: | ||
− | 3) | + | 3) Soluzione <SPAN style="text-decoration: underline">senza</span> ''Shell'', ma con il solo uso delle funzioni di Gambas, cercando il PID nel percorso ''/proc/'', partendo dal nome del processo del programma: |
'''Public''' Sub Button1_Click() | '''Public''' Sub Button1_Click() | ||
Riga 66: | Riga 66: | ||
<FONT color=#006400>' ''Mostra il numero del PID del programma:''</font> | <FONT color=#006400>' ''Mostra il numero del PID del programma:''</font> | ||
− | If comm Like "'' | + | If comm Like "''nome_processo_programma*''" Then cartella |
Endif | Endif | ||
+ | |||
+ | Next | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | 4) Soluzione <SPAN style="text-decoration: underline">senza</span> ''Shell'', ma con il solo uso delle funzioni di Gambas, cercando 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:") |[[#Note|2]]| | ||
+ | |||
+ | For Each pid In Dir("/proc") | ||
+ | |||
+ | If Exist("/proc/" & pid & "/cmdline") Then | ||
+ | s2 = File.Load("/proc/" & pid & "/cmdline") | ||
+ | |||
+ | If s2 Like "*" & s1 & "*" Then | ||
+ | <FONT color=#006400>' ''Mostra il PID del programma:''</font> | ||
+ | TextLabel1.Text = pid | ||
+ | Exit | ||
+ | Endif | ||
+ | |||
+ | Endif | ||
Next | Next | ||
Riga 85: | Riga 111: | ||
hp = Shell "''nome_programma''" | hp = Shell "''nome_programma''" | ||
− | <FONT color=#006400>' ''Individuiamo il numero del PID, che sarà uguale al valore di ''.Id'' + 1 :''</font> |[[#Note| | + | <FONT color=#006400>' ''Individuiamo il numero del PID, che sarà uguale al valore di ''.Id'' + 1 :''</font> |[[#Note|3]]| |
pid = hp.Id + 1 | pid = hp.Id + 1 | ||
Riga 96: | Riga 122: | ||
[1] Attenzione ! L'intento è quello di ottenere il PID del programma in quanto ''processo'', <SPAN style="text-decoration: underline">non</span> della ''finestra'' del programma ! | [1] Attenzione ! L'intento è quello di ottenere il PID del programma in quanto ''processo'', <SPAN style="text-decoration: underline">non</span> della ''finestra'' del programma ! | ||
− | [2] Il numero del PID, ottenuto con il metodo " .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à ''Process.Id'' rappresenta in realtà il numero del PID della ''Shell''. | + | [2] Poiché spesso il titolo della finestra non coincide esattamente con il nome del processo del programma, si avrà cura di inserire i caratteri del titolo, che richiama il nome del programma, visibile nel bordo superiore della finestra, successivi al primo del titolo medesimo. Esempio, se il titolo della finestra fosse: ''TitoloFinestra'', scriveremo: "''itoloFinestra''". |
+ | |||
+ | [3] Il numero del PID, ottenuto con il metodo " .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à ''Process.Id'' rappresenta in realtà il numero del PID della ''Shell''. |
Versione delle 08:57, 5 ott 2012
Vedremo come ottenere il PID del programma principale, ed il PID di un programma esterno |1|.
Ottenere il PID del programma Gambas principale
Si potrà ottenere il PID del programma principale attivo mediante la funzione specifica di Gambas:
Application.Handle
oppure
Application.Id
Ottenere il PID di un programma esterno al programma principale
Per individuare e raccolgiere il PID di un programma esterno a quello Gambas principale, si potranno adottare almeno due modalità:
Caso in cui il programma esterno non sia gestito dal programma.gambas mediante process.
1) Mostremo la soluzione più breve con il comando bash: pgrep -f nome_programma.
Public Sub Button1_Click() Dim index As String Dim sotto$ As String[] ' Otteniamo 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 andremo 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, ' andiamo a leggere la prima sotto-stringa dell'array. Qui è contenuto il PID del programma: Print sotto$[0] End
2) Qui mostreremo la soluzione con il comando bash 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) ' Mostriamo il nome del programma lanciato ed il suo PID: Print ss[ss.max]; " = "; ss[4] End
3) Soluzione senza Shell, ma con il solo uso delle funzioni di Gambas, cercando 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") If Exist("/proc/" & cartella & "/comm") Then comm = File.Load("/proc/" & cartella & "/comm") ' Mostra il numero del PID del programma: If comm Like "nome_processo_programma*" Then cartella Endif Next End
4) Soluzione senza Shell, ma con il solo uso delle funzioni di Gambas, cercando 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:") |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 Exit Endif Endif Next 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" ' Individuiamo il numero del PID, che sarà uguale al valore di .Id + 1 : |3| pid = hp.Id + 1 Print pid End
Note
[1] Attenzione ! L'intento è quello di ottenere il PID del programma in quanto processo, non 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 i caratteri del titolo, che richiama il nome del programma, visibile nel bordo superiore della finestra, successivi al primo del titolo medesimo. Esempio, se il titolo della finestra fosse: TitoloFinestra, scriveremo: "itoloFinestra".
[3] Il numero del PID, ottenuto con il metodo " .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à Process.Id rappresenta in realtà il numero del PID della Shell.