Pagina 1 di 1

Problemi con la execl [C]

Inviato: mercoledì 14 maggio 2014, 18:47
da raider91
Ciao ragazzi.Come da titolo avrei un problema con la execl.In pratica io so che le function della famiglia exec altro non fanno che sostituire l'immagine di un processo con una nuova.Quindi ho provato a cimentarmi da solo in una prova per vedere se avevo capito bene il funzionamento ma sono incappato in un errore.Il codice da me scritto è il seguente:

Codice: Seleziona tutto

    
   #include<stdio.h>
#include<stdlib.h>

int main (void) {

    printf("Sono il processo %d, eseguo una ls -l\n",getpid());

          execl("/bin/cd","ls", "-l", NULL); /* Esegue ls -l */

    printf("\nSi e' verificato un'errore\n\n");
      exit(-1);

}


Allora io non riesco a capire perchè non riesce a sostituire il programma cd con ls -l ,mentre se avessi scritto execl("/bin/ls","ls", "-l", NULL); sarebbe andato tutto a buon fine.Qualcuno mi sa dare delucidazioni a riguardo? Inoltre perchè se scrivo:

Codice: Seleziona tutto

execl("/bin/pwd","ls", "-l", NULL);
quando vado ad eseguire mi compare il messaggio :

Codice: Seleziona tutto

ls: opzione non valida -- "l"
Try 'ls --help' for more information.
Chi sa aiutarmi?Grazie in anticipo! :D

Re: Problemi con la execl [C]

Inviato: giovedì 15 maggio 2014, 9:33
da antex

Codice: Seleziona tutto

execl("/bin/cd","ls", "-l", NULL); /* Esegue ls -l */

Codice: Seleziona tutto

execl("/bin/pwd","ls", "-l", NULL);
Cosa pensi che facciano queste due righe di codice?
raider91 ha scritto:Allora io non riesco a capire perchè non riesce a sostituire il programma cd con ls -l
Non sostituiscono certo il programma cd (o pwd) con ls, bensì il programma in esecuzione (il tuo!).
mentre se avessi scritto execl("/bin/ls","ls", "-l", NULL); sarebbe andato tutto a buon fine.
Perché è così che va usata la execl: il secondo argomento della execl corrisponderà all'argv[0] che sarà passato al programma il cui file eseguibile è specificato come primo argomento della execl. Il suo prototipo è equivalente a

Codice: Seleziona tutto

int execl(const char *filename, const char *argv0, const char *argv1);
raider91 ha scritto:Inoltre perchè se scrivo:

Codice: Seleziona tutto

execl("/bin/pwd","ls", "-l", NULL);
quando vado ad eseguire mi compare il messaggio :

Codice: Seleziona tutto

ls: opzione non valida -- "l"
Try 'ls --help' for more information.
Perché in realtà stai eseguendo pwd (il primo argomento), non ls. Da qualche parte nel suo codice, pwd farà qualcosa come:

Codice: Seleziona tutto

printf("%s: opzione non valida -- \"l\"\n", argv[0]);
printf("Try '%s --help' for more information.\n", argv[0]);
dove argv[0] è quell'argv0 che hai passato come secondo argomento della execl.

Re: Problemi con la execl [C]

Inviato: giovedì 15 maggio 2014, 10:03
da raider91
antex [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582828#p4582828][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: Non sostituiscono certo il programma cd (o pwd) con ls, bensì il programma in esecuzione (il tuo!).

E' appunto questo quello che non capisco.Cioè che significa che sostituisce il programma in esecuzione?Cioè mi spiego meglio.Avevo detto che se scrivevo :

Codice: Seleziona tutto

 execl("/bin/pwd","ls", "-l", NULL);

Mi stampava quel messaggio d'errore che ho postato prima.Arrivati a questo punto mi sorge una domanda: ma pwd non è il mio programma in esecuzione? E se lo è per quale arcano motivo non riesce a sotituirlo con ls -l?

Re: Problemi con la execl [C]

Inviato: giovedì 15 maggio 2014, 10:29
da antex
Il processo in esecuzione è il processo che esegue la execl. Supponi di avere un file sorgente mioesempio.c in cui metti l'istruzione execl. Lo compili producendo un eseguibile di nome mioesempio. Esegui ./mioesempio: è il processo mioesempio che viene sostituito da pwd.

Re: Problemi con la execl [C]

Inviato: giovedì 15 maggio 2014, 10:56
da raider91
antex [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582856#p4582856][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Il processo in esecuzione è il processo che esegue la execl. Supponi di avere un file sorgente mioesempio.c in cui metti l'istruzione execl. Lo compili producendo un eseguibile di nome mioesempio. Esegui ./mioesempio: è il processo mioesempio che viene sostituito da pwd.
Cioè il processo in esecuzione,quello che in pratica esegue la execl,si trova specificato nel primo argomento della funzione?