Problemi con la execl [C]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Problemi con la execl [C]

Messaggio 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
antex
Prode Principiante
Messaggi: 85
Iscrizione: mercoledì 14 marzo 2012, 20:59

Re: Problemi con la execl [C]

Messaggio 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.
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: Problemi con la execl [C]

Messaggio 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?
antex
Prode Principiante
Messaggi: 85
Iscrizione: mercoledì 14 marzo 2012, 20:59

Re: Problemi con la execl [C]

Messaggio 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.
raider91
Prode Principiante
Messaggi: 164
Iscrizione: giovedì 28 marzo 2013, 13:09
Desktop: gnome-fallback
Distribuzione: ubuntu 12.04.2 LTS x86_64

Re: Problemi con la execl [C]

Messaggio 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?
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti