Differenze tra le versioni di "Individuare ed estrarre il PID di un programma"

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Vedremo come ottenere il PID del programma principale, ed il PID di un programma esterno |[[#Note|1]]|.
+
Vedremo come ottenere il PID ('''''P'''rocess '''ID'''entifier'' ) del programma principale, ed il PID di un programma esterno. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
  
  
==Ottenere il PID del programma Gambas principale==
+
=Ottenere il PID del programma Gambas principale=
Si potrà ottenere il PID del programma principale attivo mediante la funzione specifica di Gambas:
+
Si potrà ottenere il PID del programma Gambas principale attivo mediante la proprietà specifica di Gambas:
 
  Application.Handle
 
  Application.Handle
oppure
+
oppure quella analoga:
 
  Application.Id
 
  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:
 +
 +
 +
==<FONT color=#B22222><B>Caso in cui il programma esterno <SPAN style="text-decoration:underline">non</span> sia gestito dal programma.gambas mediante ''process''</b></font>==
 +
 +
 +
===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[]
 +
 
 +
<FONT Color=gray>' ''Otteniamo innanzitutto l'identificativo della finestra del programma esterno:''</font>
 +
  wid = Desktop.FindWindow("Calcolatric*", Null, Null)[0]
 +
  Print Hex(wid)
 +
   
 +
<FONT Color=gray>' ''Quindi otteniamo il PID del processo del programma esterno:''</font>
 +
  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")
 +
<FONT color=#006400>' ''Mostra il numero del PID del programma:''</font>
 +
      If comm Begins "<FONT Color=gray>''nome_processo_programma''</font>" Then Print cartella
 +
    Endif   
 +
  Next
 +
 +
End
  
==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:
 
  
 +
====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:")  <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
 +
   
 +
  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
 +
        Break
 +
      Endif
 +
    Endif
 +
  Next
 +
 +
End
  
===<FONT color=#B22222, size=4>Caso in cui il programma esterno <SPAN style="text-decoration: underline">non</span> sia gestito dal programma.gambas mediante ''process''.</font>===
 
  
 
===Soluzioni con comandi bash:===
 
===Soluzioni con comandi bash:===
  
 
====mediante uso di: ''pgrep -f nome_programma''====
 
====mediante uso di: ''pgrep -f nome_programma''====
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
  Dim index As String
 
  Dim index As String
 
  Dim sotto$ As String[]
 
  Dim sotto$ As String[]
 
    
 
    
  <FONT color=#006400>' ''Otteniamo il PID dei processo (programma) aperto:''</font>
+
  <FONT color=#006400>' ''Ottiene il PID dei processo (programma) aperto:''</font>
 
     Shell "pgrep -f ''nome_programma''"] To index
 
     Shell "pgrep -f ''nome_programma''"] To index
 
   
 
   
 
  <FONT color=#006400>' ''La variabile index sarà composta da due righe, contenenti caratteri numerali e separate da un ritorno a capo.''
 
  <FONT color=#006400>' ''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:''</font>
+
  ' ''Le andrà a distinguere in due sotto-stringhe distinte:''</font>
 
     sotto$ = Split(Trim$(index), "\n")
 
     sotto$ = Split(Trim$(index), "\n")
 
   
 
   
  <FONT color=#006400>' ''Poiché la <SPAN style="text-decoration: underline">prima</span> parola, restituita da "pgrep", è proprio il numero del PID del programma,''
+
  <FONT color=#006400>' ''Poiché la <SPAN style="text-decoration: underline">prima</span> parola, restituita da "pgrep", è proprio il numero del PID del programma, va a leggere la <SPAN style="text-decoration: underline">prima</span> sotto-stringa dell'array. Qui è contenuto il PID del programma:</font>
' ''andiamo a leggere la <SPAN style="text-decoration: underline">prima</span> sotto-stringa dell'array. Qui è contenuto il PID del programma:</font>
 
 
     Print sotto$[0]
 
     Print sotto$[0]
 
   
 
   
  '''End'''
+
  End
  
  
 
====mediante uso di: ''ps''====
 
====mediante uso di: ''ps''====
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim s1, s2As String
 
   Dim s1, s2As String
 
   Dim ss As String[]
 
   Dim ss As String[]
 
   
 
   
  Shell "ps -C \"''nome_del_programma\"" To s1
+
  Shell "ps -C \"''nome_del_programma\"" To s1
 
   
 
   
    s2 = Replace(s1, "\n", " ")
+
  s2 = Replace(s1, "\n", " ")
 
    
 
    
    ss = Split(s2, " ", "", True)
+
  ss = Split(s2, " ", "", True)
 
    
 
    
  <FONT color=#006400>' ''Mostriamo il nome del programma lanciato ed il suo PID:''</font>
+
  <FONT color=#006400>' ''Mostra il nome del programma lanciato ed il suo PID:''</font>
    Print ss[ss.max]; " = "; ss[4]
+
  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", Null, gb.Directory)
 
 
      If Exist("/proc/" & cartella & "/comm") Then
 
        comm = File.Load("/proc/" & cartella & "/comm")
 
 
<FONT color=#006400>' ''Mostra il numero del PID del programma:''</font>
 
        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
+
  End
   
 
  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
 
 
 
'''End'''
 
 
 
  
  
===<FONT color=#B22222, size=4>Caso in cui il programma esterno sia stato lanciato dal nostro programma.gambas e sia gestito mediante ''process''.</font>===
+
==<FONT color=#B22222><B>Caso in cui il programma esterno sia stato lanciato dal nostro programma.gambas e sia gestito mediante ''Process''</b></font>==
  
 
  Private hp As Process
 
  Private hp As Process
 
  Private pid As Integer
 
  Private pid As Integer
 
   
 
   
'''Public''' Sub Button1_Click()
 
 
   
 
   
   hp = Shell "''nome_programma''"
+
Public Sub Button1_Click()
 +
 +
   hp = Shell "<FONT color=gray>''nome_programma''</font>"
 
   
 
   
  <FONT color=#006400>' ''Individuiamo il numero del PID, che sarà uguale al valore di ''.Id'' + 1 :''</font>  |[[#Note|3]]|
+
  <FONT color=#006400>' ''Individua il numero del PID, che sarà uguale al valore di ''.Id'' + 1 :''</font>  <SUP>&#091;[[#Note|Nota 3]]&#093;</sup>
    pid = hp.Id + 1
+
  pid = hp.Id + 1
 
   
 
   
    Print pid
+
  Print pid
 
   
 
   
  '''End'''
+
  End
 
 
  
  
Riga 128: Riga 152:
  
 
Per analogia di argomento rinviamo a [[Individuare_l'ID_ed_il_nome_di_una_finestra_nonché_il_PID_del_programma_mediante_le_funzioni_del_API_di_X11|questa pagina della WIKI]].
 
Per analogia di argomento rinviamo a [[Individuare_l'ID_ed_il_nome_di_una_finestra_nonché_il_PID_del_programma_mediante_le_funzioni_del_API_di_X11|questa pagina della WIKI]].
 
  
  
Riga 137: Riga 160:
 
[2] Poiché spesso il titolo della finestra non coincide esattamente con il nome del processo del programma, si avrà cura di inserire solo <SPAN style="text-decoration:underline">alcuni</span> 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''".
 
[2] Poiché spesso il titolo della finestra non coincide esattamente con il nome del processo del programma, si avrà cura di inserire solo <SPAN style="text-decoration:underline">alcuni</span> 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''.
+
[3] Il numero del PID, ottenuto con la Proprietà ".Id" di [https://gambaswiki.org/wiki/comp/gb/process?l=it 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''.

Versione attuale delle 14:29, 12 ott 2023

Vedremo come ottenere il PID (Process IDentifier ) del programma principale, ed il PID di un programma esterno. [Nota 1]


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.