Exec (Unix): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Fix
Etichette: Inserimento tag INDEX o altre direttive Modifica da mobile Modifica da web per mobile
m Aggiunta sintassi C
Riga 36:
Un esempio potrebbe essere il seguente:
 
<syntaxhighlight lang="c">
execl("/bin/ls","ls", "-l", (char *)0);
</syntaxhighlight>
 
e il suo complementare che contiene la p ma non il path:
 
<syntaxhighlight lang="c">
execlp("ls","ls", "-l", (char *)0);
</syntaxhighlight>
 
Le altre lettere che possiamo trovare oltre al suffisso "p" (e, l o v) presentano dei significati ben precisi.
Riga 100 ⟶ 104:
 
==== Esempio d'uso ====
/*file sorgente execve.c*/
 
<syntaxhighlight lang="c">
#include <stdio.h>
/*file sorgente execve.c*/
#include <unistd.h>
 
#include <stdio.h>
extern char **environ;
#include <unistd.h>
 
extern char **environ;
int main() {
char *argv[]={"nomeFile", NULL};
 
int main() {
if(execve("nomeFile", argv, enviroment))==-1)
char *argv[] = {"nomeFile", NULL};
 
if(execve("nomeFile", argv, enviroment))==-1)
perror("execve fallita");
 
}
</syntaxhighlight>
 
=== execl ===
Riga 120 ⟶ 126:
Passiamo a visualizzare un esempio di utilizzo di execl:
 
<syntaxhighlight lang="c">
int main(){
printf("Esecuzione di ls\n");
execl("/bin/ls", "ls", "-l", (char*)0);
 
printf("EsecuzioneSi è verificato un errore nell'esecuzione didel lscodice\n");
exit(1);
execl("/bin/ls","ls","-l",(char*)0);
}
 
</syntaxhighlight>
printf("Si è verificato un errore nell'esecuzione del codice\n");
exit(1);
}
 
''Osservazioni'': Ci si potrebbe chiedere come mai dopo execl, ci sia una [[printf]] che segnala un errore, ed un'uscita che richiama un po' l'attenzione, ma bisogna pensare che execl elimina il programma originale sovrascrivendolo con quello passato come parametro. Quindi le istruzioni che seguono la chiamata ad execl, verranno eseguite solo se non sono state sovrascritte dal nuovo programma, cioè solo se si è verificato un errore durante l'esecuzione, e il controllo è stato ripassato al chiamante (execl).
Riga 135 ⟶ 142:
Ora vediamo un esempio di utilizzo di execv:
 
<syntaxhighlight lang="c">
int main(){
int main() {
char *a[]={"ls","-l",(char *)0};
char *a[] = {"ls", "-l", (char *)0};
printf("Esecuzione di ls\n");
execv printf("/home/Esecuzione di ls\n",a);
execv("/home/ls", a);
 
printf("Si è verificato un errore nell'esecuzione del codice\n");
exit(1);
}
</syntaxhighlight>
 
''Osservazioni'': Come prima le istruzioni che seguono la chiamata ad execv, verranno eseguite solo se non sono state sovrascritte dal nuovo programma, cioè solo se si è verificato un errore durante l'esecuzione, e il controllo è stato ripassato al chiamante (execv).
Riga 153 ⟶ 162:
Esempio di utilizzo:
 
<syntaxhighlight lang="c">
for (i=1; i<=2; i++){
fork();
fork();
execlp("echo", "myEcho", "i", (char*)0);
printf("%d\n", i); //codice che non verrà mai eseguito, a meno di errori nella execlp
}
}
</syntaxhighlight>
 
La compilazione fornirà in output:
i
Riga 167 ⟶ 177:
 
Esempio di utilizzo:
int main(){
char *a[]={"ls","-l",(char *)0};
printf("Esecuzione di ls\n");
execvp("ls",a);
 
<syntaxhighlight lang="c">
printf("Si è verificato un errore nell'esecuzione del codice\n");
int main(){
exit(1);
char *a[]={"ls", "-l", (char *)0};
}
printf("Esecuzione di ls\n");
execvp("ls", a);
 
printf("Si è verificato un errore nell'esecuzione del codice\n");
exit(1);
}
</syntaxhighlight>
 
=== execle ===