Differenze tra le versioni di "Chiudere programmi esterni"

Da Gambas-it.org - Wikipedia.
 
(27 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per terminare un programma esterno aperto è possibile usare '''Kill''' o '''Killall''' (a seconda delle situazioni).
+
Per terminare un programma esterno aperto è possibile usare:
 +
* le funzioni '''Kill''' o '''Killall''' (a seconda delle situazioni). Va distinto però il ".Kill()", quale <SPAN style="text-decoration:underline">Metodo</span> della Classe [https://gambaswiki.org/wiki/comp/gb/process?l=it''Process''] di Gambas, dal ''Kill'', quale comando bash da utilizzare con ''Shell'' (o '' Exec'');
 +
* un algoritmo capace di chiudere la sua finestra.
  
Va distinto però il ''Kill'', quale <SPAN style="text-decoration:underline">metodo</span> di ''Process'', dal ''Kill'', quale comando da utilizzare con ''Shell'' (o '' Exec'').
 
  
 
+
==Uso del Metodo ".Kill()" della Classe ''Process''==
<B><FONT color=#B22222>Caso in cui un programma esterno sia stato aperto dalla nostra applicazione.gambas, sia gestito mediante "''process''", e si intenda chiuderlo con il metodo ".Kill" di ''Process''</font></b>  |[[#Note|1]]|
+
===Caso in cui un programma esterno sia stato aperto dalla nostra applicazione.gambas, sia gestito mediante "''process''", e si intenda chiuderlo con il Metodo ".Kill()" di ''Process''===
 
+
  Private pro As Process
  Private hp As Process
+
 
   
 
   
 +
Public Sub Form_Open()
 
   
 
   
  '''Public''' Sub Form_Open()
+
  <FONT color=gray>' ''Avviamo un programma esterno e lo gestiamo come processo:''</font>
 +
  pro = Exec["<FONT color=darkgreen>''nome_programma_esterno''</font>"]
 
   
 
   
  <FONT color=#006400>' ''Avviamo un programma esterno e lo gestiamo come processo:''</font>
+
  End
    hp = Exec["''nome_programma_esterno''"]
 
 
   
 
   
'''End'''
 
 
   
 
   
 +
Public Sub Button1_Click()
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  <FONT color=gray>' ''Chiudiamo il programma esterno mediante il Metodo ".Kill()" di "Process":''</font>
 +
  pro.Kill
 
   
 
   
<FONT color=#006400>' ''Chiudiamo il programma esterno mediante il metodo di ''Process'': Kill:''</font>
+
  pro.Close
    hp.Kill
 
 
   
 
   
  '''End'''
+
  End
 
+
Per questo caso vedere anche la nota <SUP>&#091;[[#Note|nota 1]]&#093;</sup>.
  
  
<B><FONT color=#B22222>Caso in cui un programma esterno <SPAN style="text-decoration:underline">non</span> sia stato aperto dalla nostra applicazione.gambas, e <SPAN style="text-decoration:underline">non</span> sia gestito mediante "''process''"</font></b>
+
==Uso dei comandi bash ''kill'' e ''killall''==
 +
===Caso in cui un programma esterno <SPAN style="text-decoration:underline">non</span> sia stato aperto dalla nostra applicazione.gambas, e <SPAN style="text-decoration:underline">non</span> sia gestito mediante ''Process''===
  
 
In questo caso potremo utilizzare due soluzioni.
 
In questo caso potremo utilizzare due soluzioni.
  
<B>1)</b> Possiamo chiudere il programma esterno con il comando ''Killall'', lanciato con ''Shell'' (o '' Exec''), al quale passiamo il nome del programma:
+
<B>1)</b> Possiamo chiudere il programma esterno con il comando bash ''killall'', lanciato con ''Shell'' (o '' Exec''), al quale passiamo il nome del programma:
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
    Shell "Killall ''nome_programma_esterno''"
+
  Shell "<FONT Color=#B22222>killall</font> <FONT color=gray>''nome_programma_esterno''</font>"
 
   
 
   
  '''End'''
+
  End
  
  
<B>2)</b> Possiamo chiudere il programma esterno con il comando ''Kill'', lanciato con ''Shell'' (o '' Exec''), al quale passiamo il numero del PID del programma.   |[[#Note|2]]|
+
<B>2)</b> Possiamo chiudere il programma esterno con il comando bash ''kill'', lanciato con ''Shell'' (o '' Exec''), al quale passiamo il numero del PID del programma. <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
     Shell "Kill ''numero_PID_del_programma_esterno''"
+
     Shell "<FONT Color=#B22222>kill</font> <FONT Color=gray>''numero_PID_del_programma_esterno''</font>"
 
   
 
   
  '''End'''
+
  End
 
 
 
L'utilità di quest'ultima modalità può vedersi nel caso in cui si hanno più programmi ''.gambas'' aperti e si intende chiuderne uno solo. Poiché il nome del processo (visibile nel file ''/proc/numero_pid/comm'') è identico a tutti i programmi ''.gambas'' (ossia: ''gbr3''), se si adottasse il comando precedente ''killall gbr3'', si chiuderebbero tutti i programmi ''.gambas'' aperti. Se, invece, si usasse quel comando inserendo il nome del programma, ossia così: ''killall nome_programma'', si otterrebbe questo errore: ''nome_programma: nessun processo trovato'', in quanto il comando bash ''killall'' vuole il nome del ''processo'' del programma, e non quello del programma visibile nel file esecutivo.
 
L'utilità di quest'ultima modalità può vedersi nel caso in cui si hanno più programmi ''.gambas'' aperti e si intende chiuderne uno solo. Poiché il nome del processo (visibile nel file ''/proc/numero_pid/comm'') è identico a tutti i programmi ''.gambas'' (ossia: ''gbr3''), se si adottasse il comando precedente ''killall gbr3'', si chiuderebbero tutti i programmi ''.gambas'' aperti. Se, invece, si usasse quel comando inserendo il nome del programma, ossia così: ''killall nome_programma'', si otterrebbe questo errore: ''nome_programma: nessun processo trovato'', in quanto il comando bash ''killall'' vuole il nome del ''processo'' del programma, e non quello del programma visibile nel file esecutivo.
Allora, potremo inserire il nome del programma, ed individuare il suo PID; quindi chiudere il programma con il comando ''kill'':
+
<BR>Allora, potremo inserire il nome del programma Gambas, ed individuare il suo PID.
  '''Public''' Sub Button1_Click()
+
<BR>In tal caso sarà possibile utilizzare il comando bash ''kill'':
 +
  Public Sub Button1_Click()
 
   
 
   
  Dim s1, s2, pid As String
+
  Dim s1, s2, pid As String
   
 
  s1 = InputBox("Inserire il nome del programma (senza l'estensione .gambas):")
 
   
 
  For Each pid In Dir("/proc")
 
 
      
 
      
    If Exist("/proc/" & pid & "/cmdline") Then
+
  s1 = InputBox("Inserire il nome del programma Gambas (con l'estensione .gambas):")
      s2 = File.Load("/proc/" & pid & "/cmdline")
 
 
   
 
   
       If s2 Like "*" & s1 & ".gambas*" Then
+
  For Each pid In Dir("/proc", Null, gb.Directory)
        Shell "kill " & pid
+
    If Exist("/proc" &/ pid &/ "cmdline") Then
        Exit
+
      s2 = File.Load("/proc" &/ pid &/ "cmdline")
      Endif
+
       If s2 Like "*" & s1 & "\x00" Then Shell "<FONT Color=#B22222>kill</font> " & pid
   
 
 
     Endif
 
     Endif
   
 
 
   Next
 
   Next
 
+
  '''End'''
+
  End
 
 
  
  
<B><FONT color=#B22222>Caso in cui il programma esterno sia stato aperto dalla nostra applicazione.gambas, e si intenda chiuderlo con il comando ''Kill''</font></b>
+
===Caso in cui il programma esterno sia stato aperto dalla nostra applicazione.gambas, e si intenda chiuderlo con il comando bash ''kill''===
  
 
Possiamo avere due sotto-casi.
 
Possiamo avere due sotto-casi.
  
<B>1)</b> Se il programma è gestito tramite ''Process'', possiamo passare al <SPAN style="text-decoration:underline">comando</span> ''Kill'' il numero del PID ottenuto mediante il metodo "'' .Id''" di "''Process''" nel modo spiegato in [[Individuare_ed_estrarre_il_PID_di_un_programma|questa pagina]].
+
<B>1)</b> Se il programma è gestito tramite ''Process'', possiamo passare al <SPAN style="text-decoration:underline">comando bash</span> ''kill'' il numero del PID ottenuto mediante la Proprietà ".Id" di ''Process'' nel modo spiegato in [[Individuare_ed_estrarre_il_PID_di_un_programma|questa pagina]].
  
 
<B>2) </b> Se il programma <SPAN style="text-decoration:underline">non</span> è gestito mediante ''Process'', allora si dovrà scegliere un altro algoritmo per individuare e raccogliere il numero del PID del prgramma esterno da chiudere.
 
<B>2) </b> Se il programma <SPAN style="text-decoration:underline">non</span> è gestito mediante ''Process'', allora si dovrà scegliere un altro algoritmo per individuare e raccogliere il numero del PID del prgramma esterno da chiudere.
  
Quello che è <SPAN style="text-decoration:underline">da sottolineare</span>, è che in entrambi i suddetti sotto-casi il numero del PID di un programma aperto <SPAN style="text-decoration:underline">dalla nostra applicazione.gambas mediante ''Shell'' (o ''Exec'')</span>, affinché l'esecuzione del comando "''Kill''" abbia buon fine, deve essere passato a ''Kill'' <SPAN style="text-decoration:underline">incrementato di un'unità</span>:
+
Quello che è <SPAN style="text-decoration:underline">da sottolineare</span>, è che in entrambi i suddetti sotto-casi il numero del PID di un programma aperto <SPAN style="text-decoration:underline">dalla nostra applicazione.gambas mediante ''Shell'' (o ''Exec'')</span>, affinché l'esecuzione del comando ''Kill'' abbia buon fine, deve essere passato a ''kill'' <SPAN style="text-decoration:underline">incrementato di un'unità</span>:
  
  '''Public''' Sub Button1_Click()
+
Public Sub Button1_Click()
 
    
 
    
 
   Dim pidIncrementato As Integer
 
   Dim pidIncrementato As Integer
 
   
 
   
    pidIncrementato = ''numero_PID_del_programma_esterno'' '''+ 1'''
+
  pidIncrementato = ''<FONT Color=gray>''numero_PID_del_programma_esterno''</font> '''+ 1'''
 
   
 
   
    Shell "Kill pidIncrementato"
+
  Shell "<FONT Color=#B22222>kill</font> pidIncrementato"
 
   
 
   
  '''End'''
+
  End
 
 
  
  
<B><FONT color=#B22222>Caso in cui il programma esterno viene chiuso con istruzione diversa dai comandi ''Kill'' e ''Killall''</font></b>
 
  
Possiamo chiudere il programma esterno anche attraverso la chiusura espressa della sua finestra. In questo caso, però, <SPAN style="decoration-text:underline">non</span> utilizzeremo i comandi ''Kill'' e ''Killall'', bensì con la classe ''DesktopWindow''. In tal caso si dovrà attivare nel progetto anche il componente <FONT color=#B22222>''gb.desktop''</font>:
+
==Uso di altro codice capace di chiudere la finestra di un programma esterno==
 +
===mediante le risorse della Classe ''DesktopWindow'' di Gambas===
 +
Possiamo chiudere il programma esterno anche attraverso la chiusura espressa della sua finestra <SUP>&#091;[[#Note|nota 3]]&#093;</sup>. In questo caso, però, <SPAN style="decoration-text:underline">non</span> utilizzeremo i comandi bash ''kill'' e ''killall'', bensì con la classe ''DesktopWindow''. In tal caso si dovrà attivare nel progetto anche il Componente "<FONT color=#B22222>gb.desktop</font>":
  
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
  Dim ss As String[]
+
  Dim ii As Integer[]
  Dim dw As DesktopWindow
+
  Dim dw As DesktopWindow
 
   
 
   
 +
<FONT color=gray>' ''Viene individuato l'Handle del programma che ha generato la propria finestra:''</font>
 +
  ii = Desktop.FindWindow("<FONT color=darkgreen>''nome_programma o nome_della_finestra_del_programma''</font>")
 
   
 
   
  <FONT color=#006400>' ''Viene individuato l'Handle del programma che ha generato la propria finestra:''</font>
+
  <FONT color=gray>' ''Viene individuata la finestra in base al suo handle, e viene quindi inserita in una variabile di tipo "DesktopWindow":''</font>
   ss = Desktop.FindWindow("''nome_programma o nome_della_finestra_del_programma''")
+
   dw = Desktop.Windows.FromHandle(ii[0])
 
   
 
   
  <FONT color=#006400>' ''Viene individuata la finestra in base al suo handle,''
+
  <FONT color=gray>' ''Viene infine chiusa la finestra del programma, e pertanto il programma medesimo:''</font>
' e viene quindi inserita in una variabile di tipo "DesktopWindow":''</font>
 
  dw = Desktop.Windows.FromHandle(ss[0])
 
 
<FONT color=#006400>' ''Viene infine chiusa la finestra del programma, e pertanto il programma medesimo:''</font>
 
 
   <FONT color=#B22222>dw.Close()</font>
 
   <FONT color=#B22222>dw.Close()</font>
 
    
 
    
  '''End'''
+
  End
 +
 
 +
 
 +
===mediante le risorse della Classe ''Signal'' di Gambas===
 +
In quest'altro caso si dovrà attivare il Componente "gb.signal" di Gambas ed inviare il segnale ''SIGKILL'' con la Classe statica ''Signal'':
 +
Public Sub Main()
 +
 
 +
  Signal.Send(<FONT color=gray>''numero_PID_del_programma_da_chiudere''</font>, Signal.SIGKILL)
 +
 
 +
End
  
  
Facciamo un esempio pratico utilizzando anche il comando bash: ''xprop'':
+
===mediante l'uso della funzione esterna "kill()" di C===
  '''Private''' i As Integer
+
Si potrà utilizzare anche la funzione sterna di C "kill()", alla quale bisognerà passare il PID del programma esterno. Tale funzione esterna invierà un segnale ''SIGKILL'' connesso al programma esterno da chiudere:
 +
  Private Const SIGKILL As Integer = 9
 +
Private Extern kill_C(pid As Integer, signal As Integer) As Integer In "libc:6" Exec "kill"
 
   
 
   
 +
Public Sub Main()
 
   
 
   
'''Public''' Sub Form_Open() 
+
  Dim s, d, t As String
 
 
Dim pr As Process 
 
Dim ss, x As New String[] 
 
Dim s, y As String
 
 
 
  pr = Shell "xprop | grep '(WINDOW):'" For Read 
 
 
    
 
    
 +
  t = "<FONT Color=gray>''programma_esterno''</font>"
 
    
 
    
  While Not Eof(pr)
+
  For Each s In Dir("/proc", Null, gb.Directory)
    Input #pr, s
+
    If Exist("/proc" &/ s &/ "cmdline") Then
    ss.Add(s
+
      d = File.Load("/proc" &/ s &/ "cmdline")
  Wend 
+
      If d Like "*" & t & "\x00" Then <FONT Color=red>kill_C(Val(s), SIGKILL)</font>
 
+
     Endif
 
+
   Next
<FONT color=#006400>' ''Dividiamo la stringa contenente il primo valore esadecimale,''
+
   
' ''in modo tale da ottenere la seconda parte utile, priva di “0x”:''</font>
+
  End
    x = Split(ss[4], "x")
+
 
<FONT color=#006400>' ''Dividiamo la stringa contenente il secondo valore esadecimale,''
+
 
' ''in modo tale da ottenere le ultime due cifre più a destra:''</font>
+
===mediante la funzione esterna "XDestroyWindow()" della libreria esterna ''X11''===
    y = Right(ss[9], 2)
+
Per distruggere la finestra di un programma esterno si potrà utilizzare anche la funzione "XDestroyWindow()" della libreria condivisa (nella sua attuale versione) "''libX11.so.6.4.0'' ".
<FONT color=#006400>' ''Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:''</font>
 
     i = Val("&" & x[1]) - Val("&" & y) 
 
    
 
'''End'''
 
 
 
 
 
'''Public''' Sub Button1_Click()  
 
 
 
  Dim dw As DesktopWindow 
 
 
 
 
 
  dw = New DesktopWindow(i)
 
 
 
<FONT color=#006400>' ''Effettua lo spostamento della finestra:''</font>
 
    dw.<FONT color=#B22222>Close(10, 10)</font>
 
 
 
'''End'''
 
Il puntatore del mouse muterà a forma di crocetta. Si dovrà cliccare una volta sulla finestra interessata. Quindi cliccando successivamente sul Button1, la finestra prescelta del programma si chiude.  
 
  
 +
Tale funzione esterna richiede, fra l'altro, la specificazione del numero identificativo della finestra del programma da chiudere.
  
 +
Mostriamo un esempio:
 +
Library "libX11:6.4.0"
 +
 +
<FONT Color=gray>' ''Display *XOpenDisplay(display_name)''
 +
' ''Opens a connection to the X server that controls a display.''</font>
 +
Private Extern XOpenDisplay(displayP As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''XDestroyWindow(display, w)''
 +
' ''Destroys the specified window as well as all of its subwindows.''</font>
 +
Private Extern XDestroyWindow(displayP As Pointer, w As Integer)
 +
 +
<FONT Color=gray>' ''XCloseDisplay(display)''
 +
' ''Closes the connection to the X server for the display specified in the Display structure and destroys all windows.''</font>
 +
Private Extern XCloseDisplay(displayP As Pointer)
 +
 +
 +
Public Sub Main()
 +
 +
  Dim disp As Pointer
 +
 +
<FONT Color=gray>' ''Connessione al server X ed impostazione di default:''</font>
 +
  disp = XOpenDisplay(0)
 +
 +
  <FONT Color=#B22222>XDestroyWindow</font>(disp, <FONT color=gray>''num_ID_della_finestra''</font>)</font>
 +
 +
<FONT Color=gray>' ''Chiude la libreria:''</font>
 +
  XCloseDisplay(disp)
 +
 +
End
  
  
==Note==
 
[1] Vedere al riguardo anche [[Apertura_e_chiusura_di_un_processo_mediante_"Process"|questa pagina]].
 
  
[2] Come cercare ed estrarre il PID di un programma, è stato già trattato in [[Individuare_ed_estrarre_il_PID_di_un_programma|questa pagina specifica]].  |[[#Note|3]]|
+
=Note=
 +
[1] Vedere al riguardo anche questa pagina: [[Apertura e chiusura di un processo mediante Process]].
  
[3] Potremmo utilizzare, per trovare e passare il PID di un programma aperto e <SPAN style="text-decoration:underline">non</span> gestito mediante "''Process''", anche questo algoritmo:
+
[2] Come cercare ed estrarre il PID di un programma, è stato già trattato in questa pagina: [[Individuare ed estrarre il PID di un programma]].
  '''Public''' Sub Button1_Click()
+
<BR>Potremmo utilizzare, per trovare e passare il PID di un programma aperto e <SPAN style="text-decoration:underline">non</span> gestito mediante ''Process'', anche questo algoritmo:
 +
  Public Sub Button1_Click()
 
   
 
   
Dim riga As String
+
  Dim riga As String
Dim plus As String[]
+
  Dim plus As String[]
 
   
 
   
  Shell "pgrep -f ''nome_programma_da_chiudere''" To riga
+
  Shell "pgrep -f <FONT Color=gray>''nome_programma_da_chiudere''</font>" To riga
 
   
 
   
  plus = Split(riga, "\n")
+
  plus = Split(riga, "\n")
 
   
 
   
  <FONT color=#006400>' ''Passa a Kill il <SPAN style="text-decoration:underline">primo</span> elemento dell'array stringa,
+
  <FONT color=gray>' ''Passa al comando bash kill il <SPAN style="text-decoration:underline">primo</span> elemento dell'array stringa, il quale, essendo parte della stringa generata dal comando "pgrep", contiene sempre il numero del PID del programma:''</font>
' ''il quale, essendo parte della stringa generata dal comando "pgrep",''
+
  Shell "kill " & plus[0]
' ''contiene sempre il numero del PID del programma:''</font>
 
    Shell "kill " & plus[0]
 
 
   
 
   
  '''End'''
+
  End
 
 
 
oppure quest'altro che, però, procederà in modo un po' più... ''brutale'' alla chiusura del programma:
 
oppure quest'altro che, però, procederà in modo un po' più... ''brutale'' alla chiusura del programma:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
Dim riga As String
+
  Dim riga As String
Dim plus As String[]
+
  Dim plus As String[]
Dim b As Integer
+
  Dim b As Integer
 
   
 
   
  Shell "ps -aux | grep " & "''nome_programma_da_chiudere''" To riga
+
  Shell "ps -aux | grep " & "<FONT Color=gray>''nome_programma_da_chiudere''</font>" To riga
 
   
 
   
  plus = Split(riga, " ")
+
  plus = Split(riga, " ")
 
   
 
   
  For b = 0 To plus.Max
+
  For b = 0 To plus.Max
<FONT color=#006400>' ''Passa a Kill - "forzatamente" - ed in modo distinto ogni elemento dell'array stringa.
+
  <FONT color=gray>' ''Passa al comando bash kill - "forzatamente" - ed in modo distinto ogni elemento dell'array stringa.
  ' ''Quando Kill riceverà l'elemento contenente la stringa con il numero del PID del programma, questo si chiuderà:''</font>
+
  ' ''Quando kill riceverà l'elemento contenente la stringa con il numero del PID del programma, questo si chiuderà:''</font>
    Try Shell "kill " & plus[b]
+
    Try Shell "kill " & plus[b]
  Next
+
  Next
 
   
 
   
  '''End'''
+
  End
 +
 
 +
[3] Vedere anche [[Agire sulla finestra di un qualunque programma]].

Versione attuale delle 16:31, 27 giu 2024

Per terminare un programma esterno aperto è possibile usare:

  • le funzioni Kill o Killall (a seconda delle situazioni). Va distinto però il ".Kill()", quale Metodo della Classe Process di Gambas, dal Kill, quale comando bash da utilizzare con Shell (o Exec);
  • un algoritmo capace di chiudere la sua finestra.


Uso del Metodo ".Kill()" della Classe Process

Caso in cui un programma esterno sia stato aperto dalla nostra applicazione.gambas, sia gestito mediante "process", e si intenda chiuderlo con il Metodo ".Kill()" di Process

Private pro As Process


Public Sub Form_Open()

' Avviamo un programma esterno e lo gestiamo come processo:
  pro = Exec["nome_programma_esterno"]

End


Public Sub Button1_Click()

' Chiudiamo il programma esterno mediante il Metodo ".Kill()" di "Process":
  pro.Kill

  pro.Close

End

Per questo caso vedere anche la nota [nota 1].


Uso dei comandi bash kill e killall

Caso in cui un programma esterno non sia stato aperto dalla nostra applicazione.gambas, e non sia gestito mediante Process

In questo caso potremo utilizzare due soluzioni.

1) Possiamo chiudere il programma esterno con il comando bash killall, lanciato con Shell (o Exec), al quale passiamo il nome del programma:

Public Sub Button1_Click()

  Shell "killall nome_programma_esterno"

End


2) Possiamo chiudere il programma esterno con il comando bash kill, lanciato con Shell (o Exec), al quale passiamo il numero del PID del programma. [nota 2]

Public Sub Button1_Click()

   Shell "kill numero_PID_del_programma_esterno"

End

L'utilità di quest'ultima modalità può vedersi nel caso in cui si hanno più programmi .gambas aperti e si intende chiuderne uno solo. Poiché il nome del processo (visibile nel file /proc/numero_pid/comm) è identico a tutti i programmi .gambas (ossia: gbr3), se si adottasse il comando precedente killall gbr3, si chiuderebbero tutti i programmi .gambas aperti. Se, invece, si usasse quel comando inserendo il nome del programma, ossia così: killall nome_programma, si otterrebbe questo errore: nome_programma: nessun processo trovato, in quanto il comando bash killall vuole il nome del processo del programma, e non quello del programma visibile nel file esecutivo.
Allora, potremo inserire il nome del programma Gambas, ed individuare il suo PID.
In tal caso sarà possibile utilizzare il comando bash kill:

Public Sub Button1_Click()

  Dim s1, s2, pid As String
   
  s1 = InputBox("Inserire il nome del programma Gambas (con l'estensione .gambas):")

  For Each pid In Dir("/proc", Null, gb.Directory)
    If Exist("/proc" &/ pid &/ "cmdline") Then
      s2 = File.Load("/proc" &/ pid &/ "cmdline")
      If s2 Like "*" & s1 & "\x00" Then Shell "kill " & pid
    Endif
  Next

End


Caso in cui il programma esterno sia stato aperto dalla nostra applicazione.gambas, e si intenda chiuderlo con il comando bash kill

Possiamo avere due sotto-casi.

1) Se il programma è gestito tramite Process, possiamo passare al comando bash kill il numero del PID ottenuto mediante la Proprietà ".Id" di Process nel modo spiegato in questa pagina.

2) Se il programma non è gestito mediante Process, allora si dovrà scegliere un altro algoritmo per individuare e raccogliere il numero del PID del prgramma esterno da chiudere.

Quello che è da sottolineare, è che in entrambi i suddetti sotto-casi il numero del PID di un programma aperto dalla nostra applicazione.gambas mediante Shell (o Exec), affinché l'esecuzione del comando Kill abbia buon fine, deve essere passato a kill incrementato di un'unità:

Public Sub Button1_Click()
 
  Dim pidIncrementato As Integer

  pidIncrementato = numero_PID_del_programma_esterno + 1

  Shell "kill pidIncrementato"

End


Uso di altro codice capace di chiudere la finestra di un programma esterno

mediante le risorse della Classe DesktopWindow di Gambas

Possiamo chiudere il programma esterno anche attraverso la chiusura espressa della sua finestra [nota 3]. In questo caso, però, non utilizzeremo i comandi bash kill e killall, bensì con la classe DesktopWindow. In tal caso si dovrà attivare nel progetto anche il Componente "gb.desktop":

Public Sub Button1_Click()

  Dim ii As Integer[]
  Dim dw As DesktopWindow

' Viene individuato l'Handle del programma che ha generato la propria finestra:
  ii = Desktop.FindWindow("nome_programma o nome_della_finestra_del_programma")

' Viene individuata la finestra in base al suo handle, e viene quindi inserita in una variabile di tipo "DesktopWindow":
  dw = Desktop.Windows.FromHandle(ii[0])

' Viene infine chiusa la finestra del programma, e pertanto il programma medesimo:
  dw.Close()
 
End


mediante le risorse della Classe Signal di Gambas

In quest'altro caso si dovrà attivare il Componente "gb.signal" di Gambas ed inviare il segnale SIGKILL con la Classe statica Signal:

Public Sub Main()
 
  Signal.Send(numero_PID_del_programma_da_chiudere, Signal.SIGKILL)
  
End


mediante l'uso della funzione esterna "kill()" di C

Si potrà utilizzare anche la funzione sterna di C "kill()", alla quale bisognerà passare il PID del programma esterno. Tale funzione esterna invierà un segnale SIGKILL connesso al programma esterno da chiudere:

Private Const SIGKILL As Integer = 9
Private Extern kill_C(pid As Integer, signal As Integer) As Integer In "libc:6" Exec "kill"

Public Sub Main()

  Dim s, d, t As String
  
  t = "programma_esterno" 
 
  For Each s In Dir("/proc", Null, gb.Directory)
    If Exist("/proc" &/ s &/ "cmdline") Then 
      d = File.Load("/proc" &/ s &/ "cmdline")
      If d Like "*" & t & "\x00" Then kill_C(Val(s), SIGKILL)
    Endif
  Next

End


mediante la funzione esterna "XDestroyWindow()" della libreria esterna X11

Per distruggere la finestra di un programma esterno si potrà utilizzare anche la funzione "XDestroyWindow()" della libreria condivisa (nella sua attuale versione) "libX11.so.6.4.0 ".

Tale funzione esterna richiede, fra l'altro, la specificazione del numero identificativo della finestra del programma da chiudere.

Mostriamo un esempio:

Library "libX11:6.4.0"

' Display *XOpenDisplay(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(displayP As Pointer) As Pointer

' XDestroyWindow(display, w)
' Destroys the specified window as well as all of its subwindows.
Private Extern XDestroyWindow(displayP As Pointer, w As Integer)

' XCloseDisplay(display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(displayP As Pointer)


Public Sub Main()

  Dim disp As Pointer

' Connessione al server X ed impostazione di default:
  disp = XOpenDisplay(0)

  XDestroyWindow(disp, num_ID_della_finestra)</font>

' Chiude la libreria:
  XCloseDisplay(disp)

End


Note

[1] Vedere al riguardo anche questa pagina: Apertura e chiusura di un processo mediante Process.

[2] Come cercare ed estrarre il PID di un programma, è stato già trattato in questa pagina: Individuare ed estrarre il PID di un programma.
Potremmo utilizzare, per trovare e passare il PID di un programma aperto e non gestito mediante Process, anche questo algoritmo:

Public Sub Button1_Click()

  Dim riga As String
  Dim plus As String[]

  Shell "pgrep -f nome_programma_da_chiudere" To riga

  plus = Split(riga, "\n")

' Passa al comando bash kill il primo elemento dell'array stringa, il quale, essendo parte della stringa generata dal comando "pgrep", contiene sempre il numero del PID del programma:
  Shell "kill " & plus[0]

End

oppure quest'altro che, però, procederà in modo un po' più... brutale alla chiusura del programma:

Public Sub Button1_Click()

  Dim riga As String
  Dim plus As String[]
  Dim b As Integer

  Shell "ps -aux | grep " & "nome_programma_da_chiudere" To riga

  plus = Split(riga, " ")

  For b = 0 To plus.Max
 ' Passa al comando bash kill - "forzatamente" - ed in modo distinto ogni elemento dell'array stringa.
' Quando kill riceverà l'elemento contenente la stringa con il numero del PID del programma, questo si chiuderà:
    Try Shell "kill " & plus[b]
  Next

End

[3] Vedere anche Agire sulla finestra di un qualunque programma.