Individuare ed estrarre il PID di un programma

Da Gambas-it.org - Wikipedia.

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 diverse modalità in base ai casi:


Caso in cui il programma esterno non sia gestito dal programma.gambas mediante process.

Soluzioni con comandi bash:

mediante uso di: 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


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)
 
' Mostriamo il nome del programma lanciato ed il suo PID:
    Print ss[ss.max]; " = "; ss[4]

End


Soluzioni senza Shell, ma con il solo uso delle funzioni di Gambas

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, "", gb.Directory)

     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 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:")   |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 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 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.