Autore Topic: Intercettare applicazione aperta e chiuderla,  (Letto 892 volte)

Offline Devil78

  • Gambero
  • **
  • Post: 61
  • L'intelligente ha molti limiti, il demente No!
    • Mostra profilo
Intercettare applicazione aperta e chiuderla,
« il: 13 Settembre 2014, 11:37:08 »
Ciao a tutti, volevo sapere se fosse possibile intercettare un applicazione aperta ed, eventualmente chiuderla. Per esempio, il mio programma deve aprire brasero, ma prima di farlo vorrei capire se questo è gia aperto e, in caso affermativo, chiuderlo o, cmq, impedire di avviare un ulteriore istanza dello stesso.
Oltre a questo, vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
Codice: gambas [Seleziona]
Shell "Killall nomeprogramma"
oppure
Codice: gambas [Seleziona]
Shell "kill 12345"


Grazie!
« Ultima modifica: 13 Settembre 2014, 11:43:18 da Devil78 »

Offline Devil78

  • Gambero
  • **
  • Post: 61
  • L'intelligente ha molti limiti, il demente No!
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #1 il: 13 Settembre 2014, 13:14:12 »
Ho trovato una discussione simile nella sezione Gambas 2, posso usare quella come linea da seguire o Gambas 3 fornisce nuovi strumenti ?!? Nel primo caso chiudo questo Topic!!! Gracias!

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #2 il: 13 Settembre 2014, 13:14:45 »
Questione num. 1:

... il mio programma deve aprire brasero, ma prima di farlo vorrei capire se questo è gia aperto....
Io suggerirei di verificare se il suo PID esiste.
Si potrebbe così cercarlo in /proc, ad esempio, con le sole risorse di Gambas come segue:

Codice: gambas [Seleziona]
Public Sub Main()

Dim cartella, comm As String
Dim nome_processo_programma As String = "brasero"

' Di ogni cartella presente in "/proc" pone il percorso nella variabile "cartella":
  For Each cartella In Dir("/proc", Null, gb.Directory)

' Se in ogni cartella dei PID nella directory "/proc" c'è un file di testo chiamato "comm",
' ne carica il contenuto nella variabile Stringa "comm"
    If Exist("/proc/" & cartella & "/comm") Then
      comm = File.Load("/proc/" & cartella & "/comm")

' Verifica se in "comm" v'è in tutto o in parte il "nome" del programma che cerchiamo:
      If comm Like nome_processo_programma & "*" Then
        Print "Il programma "; nome_processo_programma; " è già in funzione !"
      Endif

    Endif
  
  Next

End



Vedi anche in generale:
http://www.gambas-it.org/wiki/index.php?title=Individuare_ed_estrarre_il_PID_di_un_programma
« Ultima modifica: 13 Settembre 2014, 14:47:54 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #3 il: 13 Settembre 2014, 14:38:13 »
2^ questione:

vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
   
Codice: [Seleziona]
Shell "Killall nomeprogramma"
oppure
   
Codice: [Seleziona]
Shell "kill 12345"

Devi usare la Classe "Process":

Codice: gambas [Seleziona]
Private hp As Process


Public Sub Form_Open()

' Avviamo un programma esterno e lo gestiamo come processo:
   hp = Shell "brasero"

End


Public Sub Button1_Click()

' Chiudiamo il programma esterno mediante il metodo di Process ".Kill":
   hp.Kill
   
   hp.Close

End



Vedi anche in generale:
http://www.gambas-it.org/wiki/index.php?title=Chiudere_programmi_esterni
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Devil78

  • Gambero
  • **
  • Post: 61
  • L'intelligente ha molti limiti, il demente No!
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #4 il: 13 Settembre 2014, 14:51:01 »
Grazie Vuott, mi sembra di aver capito che il wiki rappresenti un ottima risorsa da cui poter attingere utili info prima di buttarsi nel Forum!!!

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #5 il: 13 Settembre 2014, 14:58:47 »
mi sembra di aver capito che il wiki rappresenti un ottima risorsa da cui poter attingere utili info prima di buttarsi nel Forum!!!

....diciamo che è semplicemente e solamente "aggiuntiva"  :-\ rispetto alla guida on line ed alle discussioni presenti in questo (e negli altri) forum, ed all'aiuto che puoi ricevere nel forum dagli altri utenti.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #6 il: 13 Settembre 2014, 15:22:50 »
vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
  
Codice: [Seleziona]
Shell "Killall nomeprogramma"
oppure
  
Codice: [Seleziona]
Shell "kill 12345"

....potresti fare anche il complicato  ;D  usando la funzione esterna "kill()" di C:

Codice: gambas [Seleziona]
Private Const SIGKILL As Integer = 9
Private hp As Process
Private Extern uccidilo(pid As Integer, sig As Integer) As Integer In "libc:6" Exec "kill"


Public Sub Form_Open()

' Avviamo un programma esterno e lo gestiamo come processo:
   hp = Shell "brasero"

End


Public Sub Button1_Click()

' Chiudiamo il programma esterno mediante la funzione esterna di C:
    uccidilo(hp.Handle + 1, SIGKILL)
    
    hp.Close

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Devil78

  • Gambero
  • **
  • Post: 61
  • L'intelligente ha molti limiti, il demente No!
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #7 il: 13 Settembre 2014, 15:38:54 »
mi sembra di aver capito che il wiki rappresenti un ottima risorsa da cui poter attingere utili info prima di buttarsi nel Forum!!!

....diciamo che è semplicemente e solamente "aggiuntiva:-\ rispetto alla guida on line ed alle discussioni presenti in questo (e negli altri) forum, ed all'aiuto che puoi ricevere nel forum dagli altri utenti.

Assolutamente si, solo che, per risolvere un problemino del genere sarebbe stato più che sufficiente.
vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
   
Codice: [Seleziona]
Shell "Killall nomeprogramma"
oppure
   
Codice: [Seleziona]
Shell "kill 12345"

....potresti fare anche il complicato  ;D  usando la funzione esterna "kill()" di C:

Codice: gambas [Seleziona]
Private Const SIGKILL As Integer = 9
Private hp As Process
Private Extern uccidilo(pid As Integer, sig As Integer) As Integer In "libc:6" Exec "kill"


Public Sub Form_Open()

' Avviamo un programma esterno e lo gestiamo come processo:
   hp = Shell "brasero"

End


Public Sub Button1_Click()

' Chiudiamo il programma esterno mediante la funzione esterna di C:
    uccidilo(hp.Handle + 1, SIGKILL)
   
    hp.Close

End



Ovviamente  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #8 il: 24 Ottobre 2014, 12:53:30 »
Potresti, inoltre, chiudere un'applicazione grafica chiudendo la sua finestra mediante la funzione esterna XDestroyWindow() della libreria X11, alla quale bisognerà passare l'ID di quella finestra:
Codice: gambas [Seleziona]
Library "libX11:6.3.0"

' Display *XOpenDisplay(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) 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(Null)

' Distrugge la finestra del programma esterno individuata dal suo ID:
   XDestroyWindow(disp, ID_della_finestra)

' Chiude la libreria:
   XCloseDisplay(disp)

End
« Ultima modifica: 12 Dicembre 2014, 17:27:18 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #9 il: 24 Novembre 2014, 13:48:11 »
Ma per killare un processo non si deve essere "root" o divenirlo con "sudo"?
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Intercettare applicazione aperta e chiuderla,
« Risposta #10 il: 24 Novembre 2014, 16:04:27 »
No.

Inoltre, operando a livello di server X, la funzione XDestroyWindow() distrugge la finestra specificata e tutte le sue sottofinestre.
« Ultima modifica: 12 Dicembre 2014, 17:28:03 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »