Differenze tra le versioni di "Execv ()"

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 2: Riga 2:
 
  int execv (const char *__path, char *const __argv[])
 
  int execv (const char *__path, char *const __argv[])
 
esegue il programma indicato dal suo percorso contenuto nella stringa del primo argomento ''__path''. Al file del programma possono essere associati altri argomenti che rappresentano opzioni e file supportati dal comando del programma avviato.
 
esegue il programma indicato dal suo percorso contenuto nella stringa del primo argomento ''__path''. Al file del programma possono essere associati altri argomenti che rappresentano opzioni e file supportati dal comando del programma avviato.
<BR>Il primo elemento del vettore di tipo stringa, ossia del secondo parametro della funzione ''execv()'', deve contenere uno spazio vuoto. L'eventuale file da passare ed utilizzare con il programma da lanciare, nonché le eventuali opzioni da passare, vanno posti dal secondo elemento del vettore di tipo Stringa.
+
<BR>Il primo elemento del vettore di tipo stringa, ossia del secondo parametro della funzione "execv()", deve contenere uno spazio vuoto. L'eventuale file da passare ed utilizzare con il programma da lanciare, nonché le eventuali opzioni da passare, vanno posti dal secondo elemento del vettore di tipo Stringa.
<BR>Nel caso di errore la funzione ''execv()'' ritorna il valore -1, altrimenti in caso di successo non ritorna alcun valore.
+
<BR>Nel caso di errore la funzione "execv()" ritorna il valore -1, altrimenti in caso di successo non ritorna alcun valore.
 
 
  
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
Riga 16: Riga 15:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  <FONT color=#B22222>execv(System.Find("evince"), [" ", "http:&lt;/www.indirizzo/web/del/file.pdf"])</font>
+
  <FONT color=#B22222>execv(System.Find("evince"), [" ", "http:&lt;/www.indirizzo/web/del/file.pdf"])</font>
 
    
 
    
  '''End'''
+
  End
  
  
Riga 29: Riga 28:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  <FONT color=#B22222>execv</font>(System.Find("xterm"), [" ", "-e", System.Find("vlc"), "/percorso/del/file/audio"])
+
  <FONT color=#B22222>execv</font>(System.Find("xterm"), [" ", "-e", System.Find("vlc"), "/percorso/del/file/audio"])
 
    
 
    
  '''End'''
+
  End
 
Di seguito il medesimo esempio, ma utilizzando l'emulatore di Terminale ''gnome-terminal'':
 
Di seguito il medesimo esempio, ma utilizzando l'emulatore di Terminale ''gnome-terminal'':
 
  <FONT color=Gray>' ''int execv (const char *__path, char *const __argv[])''
 
  <FONT color=Gray>' ''int execv (const char *__path, char *const __argv[])''
Riga 40: Riga 39:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
  <FONT color=#B22222>execv</font>(System.Find("gnome-terminal"), [" ", "-x", System.Find("vlc"), "/percorso/del/file/audio"])
+
  <FONT color=#B22222>execv</font>(System.Find("gnome-terminal"), [" ", "-x", System.Find("vlc"), "/percorso/del/file/audio"])
 
    
 
    
  '''End'''
+
  End
  
  
In questo esempio, molto simile ai precedenti, usando anche la funzione ''fork()'' sarà possibile ottenere il pid del processo del programma lanciato con la funzione ''execv()'', e quindi - volendo - terminarlo arbitrariamente:
+
In questo esempio, molto simile ai precedenti, usando anche la funzione "fork()" sarà possibile ottenere il pid del processo del programma lanciato con la funzione "execv()", e quindi - volendo - terminarlo arbitrariamente:
 
  Private pid As Integer
 
  Private pid As Integer
 
   
 
   
 
  Library "libc:6"
 
  Library "libc:6"
 +
 +
Private Const SIGKILL As Integer = 9
 
   
 
   
 
  <FONT color=Gray>' ''__pid_t fork (void)''
 
  <FONT color=Gray>' ''__pid_t fork (void)''
Riga 59: Riga 60:
 
  ' ''Execute PATH with arguments ARGV and environment from `environ'.''</font>
 
  ' ''Execute PATH with arguments ARGV and environment from `environ'.''</font>
 
  Private Extern <FONT color=#B22222>execv</font>(path As String, argv As String[]) as Integer In "<FONT color=#B22222>libc:6</font>"
 
  Private Extern <FONT color=#B22222>execv</font>(path As String, argv As String[]) as Integer In "<FONT color=#B22222>libc:6</font>"
 +
 +
<FONT color=Gray>' ''int kill (__pid_t __pid, int __sig)''
 +
' ''Send signal SIG to process number PID.''</font>
 +
Private Extern kill_C(__pid As Integer, __sig As Integer) As Integer Exec "kill"
 
    
 
    
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
  pid = fork()
+
  pid = fork()
 
   
 
   
  If pid = 0 Then
+
  If pid == 0 Then
    <FONT color=#B22222>execv</font>(System.Find("vlc"), [" ", "/percorso/del/file/audio"])
+
    <FONT color=#B22222>execv</font>(System.Find("vlc"), [" ", "/percorso/del/file/audio"])
  Endif
+
  Endif
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Application_Read()
+
  Public Sub Application_Read()
 
   
 
   
 
   Dim s As String
 
   Dim s As String
 
   
 
   
  Input s
+
  Input s
 
   
 
   
  If s <> Null Then Shell "kill " & CStr(pid)
+
  If s <> Null Then kill_C(pid, SIGKILL)
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 11:42, 13 giu 2024

La funzione della libreria di C

int execv (const char *__path, char *const __argv[])

esegue il programma indicato dal suo percorso contenuto nella stringa del primo argomento __path. Al file del programma possono essere associati altri argomenti che rappresentano opzioni e file supportati dal comando del programma avviato.
Il primo elemento del vettore di tipo stringa, ossia del secondo parametro della funzione "execv()", deve contenere uno spazio vuoto. L'eventuale file da passare ed utilizzare con il programma da lanciare, nonché le eventuali opzioni da passare, vanno posti dal secondo elemento del vettore di tipo Stringa.
Nel caso di errore la funzione "execv()" ritorna il valore -1, altrimenti in caso di successo non ritorna alcun valore.

Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:

Private Extern execv(path As String, argv As String[]) As Integer In "libc:6"


Semplice esempio di uso in Gambas, nel quale viene lanciato il programma "evince" ed aperto con esso un file pdf da internet:

' int execv (const char *__path, char *const __argv[])
' Execute PATH with arguments ARGV and environment from `environ'.
Private Extern execv(path As String, argv As String[]) as Integer In "libc:6"


Public Sub Main()
  
 execv(System.Find("evince"), [" ", "http:</www.indirizzo/web/del/file.pdf"])
  
End


In quest'altro esempio viene lanciato l'emulatore di Terminale xterm, dal quale si fa lanciare il lettore audio vlc che eseguirà un file audio:

' int execv (const char *__path, char *const __argv[])
' Execute PATH with arguments ARGV and environment from `environ'.
Private Extern execv(path As String, argv As String[]) as Integer In "libc:6"


Public Sub Main()
  
 execv(System.Find("xterm"), [" ", "-e", System.Find("vlc"), "/percorso/del/file/audio"])
  
End

Di seguito il medesimo esempio, ma utilizzando l'emulatore di Terminale gnome-terminal:

' int execv (const char *__path, char *const __argv[])
' Execute PATH with arguments ARGV and environment from `environ'.
Private Extern execv(path As String, argv As String[]) as Integer In "libc:6"


Public Sub Main()
  
 execv(System.Find("gnome-terminal"), [" ", "-x", System.Find("vlc"), "/percorso/del/file/audio"])
  
End


In questo esempio, molto simile ai precedenti, usando anche la funzione "fork()" sarà possibile ottenere il pid del processo del programma lanciato con la funzione "execv()", e quindi - volendo - terminarlo arbitrariamente:

Private pid As Integer

Library "libc:6"

Private Const SIGKILL As Integer = 9

' __pid_t fork (void)
' Clone the calling process, creating an exact copy.
Private Extern fork() As Integer

' int execv (const char *__path, char *const __argv[])
' Execute PATH with arguments ARGV and environment from `environ'.
Private Extern execv(path As String, argv As String[]) as Integer In "libc:6"

' int kill (__pid_t __pid, int __sig)
' Send signal SIG to process number PID.
Private Extern kill_C(__pid As Integer, __sig As Integer) As Integer Exec "kill"
 

Public Sub Main()

 pid = fork()

 If pid == 0 Then
   execv(System.Find("vlc"), [" ", "/percorso/del/file/audio"])
 Endif

End


Public Sub Application_Read()

 Dim s As String

 Input s

 If s <> Null Then kill_C(pid, SIGKILL)

End