PDA

Visualizza la versione completa : [C] Vari tipi di exec() ed esempi pratici


magicofred
12-02-2007, 20:53
ciao a tutti, per caso potete farmi degli esempi pratici(non teorici) sull'uso dei 6 vari tipi di exec? nn ho capito bene come usarle... grazie

Samuele_70
12-02-2007, 21:42
Che compilatore usi?
Per quelli della famiglia Borland :


/* execl() example */
#include <stdio.h>
#include <process.h>

int main(int argc, char *argv[])
{
int loop;

printf("%s running...\n\n", argv[0]);

if (argc == 1) { /* check for only one command-line parameter */
printf("%s calling itself again...\n", argv[0]);
execl(argv[0], argv[0], "ONE", "TWO", "THREE", NULL);
perror("EXEC:");
exit(1);
}

printf("%s called with arguments:\n", argv[0]);

for (loop = 1; loop <= argc; loop++)

puts(argv[loop]); /* Display all command-line parameters */
return 0;
}

Ti rimando all'help del compilatre (da cui ho preso il codice) per i dettagli.

andbin
12-02-2007, 21:44
Originariamente inviato da magicofred
ciao a tutti, per caso potete farmi degli esempi pratici(non teorici) sull'uso dei 6 vari tipi di exec? nn ho capito bene come usarle... grazie Naturalmente stiamo parlando delle exec() sui sistemi Linux/Unix.

La documentazione comunque mi sembra abbastanza chiara (vedi <qui> (http://linux.about.com/library/cmd/blcmdl3_execl.htm) e <qui> (http://www.gnu.org/software/libc/manual/html_node/Executing-a-File.html#Executing-a-File)).

Le exec con la 'v' (execv/execvp/execve) hanno un parametro che è un array di argomenti (l'ultimo elemento dell'array deve essere NULL).
Le exec con la 'l' (execl/execlp/execle) prendono un numero variabile di argomenti (l'ultimo argomento passato deve essere un NULL).

Le execX prendono come primo parametro un file da lanciare.
Le execXp sono in grado di cercare l'eseguibile secondo gli stessi criteri della shell se non viene specificato un path nel file.
Le execXe hanno un parametro che è un array di stringhe che contiene le variabili di ambiente da passare al processo.

Tutto qua.

magicofred
12-02-2007, 22:45
si ho letto già le guide, ho anche capito le varie differenze.. ma magari vorrei chiedervi degli esempi pratici e reali su come usare le varie exec... grazie ancora

magicofred
13-02-2007, 13:22
help please!:(

andbin
13-02-2007, 15:12
Originariamente inviato da magicofred
vorrei chiedervi degli esempi pratici e reali su come usare le varie execInnanzitutto bisogna dire che le execXX si usano in genere dopo che è stato fatto il fork del processo. Questo perché una exec rimpiazza di brutto l'immagine del processo corrente con il nuovo processo caricato.

Si fa una fork() e poi nel processo figlio si esegue una exec. Ecco un esempio:


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main (void)
{
pid_t pid;

pid = fork ();

if (pid == 0)
{
/*---- figlio ----*/
int ret;
char *args[4] = { "ls", "-laA", "/tmp", NULL };

ret = execvp (args[0], args);
if (ret == -1)
perror ("execvp");
}
else if (pid != -1)
{
/*---- padre ----*/
int status;

waitpid (pid, &status, 0);
printf ("Status: %d\n", status);
}
else
perror ("fork");

return 0;
}

giuseppe500
02-10-2007, 11:37
grazie,il mio problema è che uso visual studio c++ 2003 e non mi fa l'include di queste lib:
Citazione:
Originariamente inviato da magicofred
vorrei chiedervi degli esempi pratici e reali su come usare le varie exec
Innanzitutto bisogna dire che le execXX si usano in genere dopo che è stato fatto il fork del processo. Questo perché una exec rimpiazza di brutto l'immagine del processo corrente con il nuovo processo caricato.

Si fa una fork() e poi nel processo figlio si esegue una exec. Ecco un esempio:

codice:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

come mai?
grazie.

andbin
02-10-2007, 11:55
Originariamente inviato da giuseppe500
grazie,il mio problema è che uso visual studio c++ 2003 e non mi fa l'include di queste lib:In Windows fork() e il concetto del "fork" di un processo non esistono .... e gli header non necessariamente sono uguali a quelli su linux.

La documentazione (basta leggerla, no?) del mio VC++ 2003 dice che le execXXX ci sono e sono chiamate _execl, _execv ecc.... e l'header principale da usare è <process.h>

mondobimbi
02-10-2007, 15:52
vorrei aggiungere una considerazione all'uso delle varie exec. Ci sono gravi pericoli di vulnerabilità nell'uso di tali funzioni dovuto alla caratteristica di dette funzioni di passare le stringhe di ambiente al processo da eseguire.
Solo le funzioni execve, execle e fexecve non soffrono di questo problema e sono considerate sicure in quanto permettono di specificare la stringa di ambiente al processo.
ciao
sergio.

Loading