Differenze tra le versioni di "Conoscere in tempo reale il numero dell'ultimo processo appena aperto"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per conoscere l'ultimo processo avviato bisognerà interrogare la cartella ''proc'' del ''File System''.
+
Per conoscere l'ultimo processo avviato bisognerà interrogare la cartella ''/proc'' del ''FileSystem''.
  
 
Vediamo di seguito un paio di modalità.
 
Vediamo di seguito un paio di modalità.
 
  
 
===Leggere il file ''/proc/loadavg''===
 
===Leggere il file ''/proc/loadavg''===
Il modo più semplice, per conoscere l'ultimo processo avviato, è quello di leggere l'ultimo campo a destra presente nel file di testo ''loadavg'' prtesente nella Cartella di ''/proc'' .
+
Per conoscere in tempo reale l'ultimo processo avviato nel sistema, è quello di leggere l'ultimo campo a destra presente nel file di testo ''loadavg'' presente nella Cartella di ''/proc''. Tale campo rappresenta il PID del processo.
 
+
  Public Sub Main()
Esempio:
 
  '''Public''' Sub Main()
 
 
   
 
   
 
   Dim s As String
 
   Dim s As String
    
+
  s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
+
   Do
 
+
    s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
  Print s
+
    Write "\r" & Trim(s)
    
+
    Flush
  '''End'''
+
    Wait 0.1
 
+
   Loop
 +
 +
  End
  
===Verificare le sub-cartelle dei processi aperti===
 
In tale modalità si controlleranno le sottocartelle presenti nella cartella di ''/proc'', verificando ogni tot tempo la presenza di una nuova Cartella relativa ad un processo. La Cartella, avente come nome il numero più elevato in quel momento, apparterrà al più recente processo avviato.
 
  
Nell'esempio, che segue, si andrà a leggere nella cartella ''/proc'' ogni 200 millesimi di secondo mediante l'attivazione di un ''Timer'', per conoscere in tempo reale il numero dell'ultimo processo appena aperto, nonché il file lanciato ed il suo programma esecutore.
+
===Verificare le cartelle dei processi aperti===
 +
In tale modalità si controlleranno le sottocartelle presenti nella cartella di ''/proc'', verificando ogni tot tempo la presenza di una nuova Cartella relativa ad un processo. La Cartella, avente come nome identificativo il numero più elevato in quel momento, apparterrà al più recente processo avviato.
  
In sostanza si dovrà prima lanciare il codice Gambas, sotto descritto, e successivamente aprire un qualsiasi programma.
+
Nel seguente esempio si verificherà in tempo reale il numero identificativo (PID) della cartella dell'ultimo processo effettivamente attivo:
  '''Public''' Sub Form_Open()
+
  Public Sub Main()
 
  With Timer1
 
    .delay = 200
 
    .Start
 
  End With
 
 
 
'''End'''
 
 
   
 
   
 
'''Public''' Sub Timer1_Timer() 
 
 
  Dim s As String
 
 
   Dim ss As String[]
 
   Dim ss As String[]
 
   
 
   
<FONT color=gray>' ''Ogni ms 200 si legge tutto il contenuto della cartella "proc".''
+
  Do
' ''Se il contenuto letto è una cartella, allora vuol dire che si tratta di un processo.''
+
    ss = Dir("/proc", "*", gb.Directory)
' ''Risulterà visibile, come effetto, l'ultimo processo in ordine di tempo aperto:''</font>
+
    Write "\r\e[0mProcesso attivo: \e[31m" & ss[ss.Max]
  For Each s In Dir("/proc", Null, gb.Directory)
+
    Flush
    TextEdit1.RichText = "Processo: " & s
+
    Wait 0.01
  Next
+
  Loop
 
 
  If Exist("/proc" &/ s &/ "cmdline") Then
 
    ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
 
    TextEdit1.RichText &= "Programma esecutore:&lt;BR>" & String@(Pointer@(ss.Data)) &
 
    "&lt;P>File eseguito:&lt;BR>" & String@(Pointer@(ss.Data + 32))
 
  Endif
 
 
   
 
   
  '''End'''
+
  End
  
  
====Il medesimo esempio, ma con un'applicazione ''a riga di comando''====
+
In quest'altro esempio si verificherà la quantità iniziale di cartelle dei processi aperti. Se tale quantità di cartelle dei processi aumenta, allora è stato lanciato un programma, e ne verrà mostrato il PID:
Se l'applicazione Gambas è ''a riga di comando'', potremo servirci di un ciclo, dal quale si uscirà soltanto quando sarà stato aperto un nuovo processo:
+
  Public Sub Main()
  '''Public''' Sub Main()
 
 
   
 
   
 
   Dim c As Short
 
   Dim c As Short
Riga 87: Riga 67:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 16:47, 11 lug 2023

Per conoscere l'ultimo processo avviato bisognerà interrogare la cartella /proc del FileSystem.

Vediamo di seguito un paio di modalità.

Leggere il file /proc/loadavg

Per conoscere in tempo reale l'ultimo processo avviato nel sistema, è quello di leggere l'ultimo campo a destra presente nel file di testo loadavg presente nella Cartella di /proc. Tale campo rappresenta il PID del processo.

Public Sub Main()

 Dim s As String

 Do
   s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
   Write "\r" & Trim(s)
   Flush 
   Wait 0.1
 Loop

End


Verificare le cartelle dei processi aperti

In tale modalità si controlleranno le sottocartelle presenti nella cartella di /proc, verificando ogni tot tempo la presenza di una nuova Cartella relativa ad un processo. La Cartella, avente come nome identificativo il numero più elevato in quel momento, apparterrà al più recente processo avviato.

Nel seguente esempio si verificherà in tempo reale il numero identificativo (PID) della cartella dell'ultimo processo effettivamente attivo:

Public Sub Main()

 Dim ss As String[]

 Do
   ss = Dir("/proc", "*", gb.Directory)
   Write "\r\e[0mProcesso attivo: \e[31m" & ss[ss.Max]
   Flush 
   Wait 0.01
 Loop

End


In quest'altro esempio si verificherà la quantità iniziale di cartelle dei processi aperti. Se tale quantità di cartelle dei processi aumenta, allora è stato lanciato un programma, e ne verrà mostrato il PID:

Public Sub Main()

 Dim c As Short
 Dim s As String
 Dim ss As String[]

' Verifichiamo inizialmente quante cartelle sono presenti in "/proc":
 c = Dir("/proc", Null, gb.Directory).Count
 
 Repeat
   Wait 0.1
 Until c < Dir("/proc", Null, gb.Directory).Count
 
' L'ultima cartella dell'indice del vettore generato dalla funzione "Dir()" è l'ultimo processo appena aperto:
 s = Dir("/proc", Null, gb.Directory)[Dir("/proc", Null, gb.Directory).Max]

' Oppure anche così:
' For Each s In Dir("/proc", Null, gb.Directory)
'   If IsDigit(s) Then s = s
' Next
      
 Print "Processo: "; s

 If Exist("/proc" &/ s &/ "cmdline") Then
   ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
   Print "Esecutore:  "; String@(Pointer@(ss.Data))
   Print "File eseguito:  "; String@(Pointer@(ss.Data + (8 * ss.Max)))
 Endif
 
End