Conoscere in tempo reale il numero dell'ultimo processo appena aperto

Da Gambas-it.org - Wikipedia.

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