Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [C] Uso execl

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12

    [C] Uso execl

    Ciao a tutti....
    Da poco ho iniziato a studiare il linguaggio C (già uso java molto bene) e mi sono imbattuto in quella parte del linguaggio dedicata ai processi....Non sono riuscito a capire ("praticamente") come funziona il comando execl (ossia come cambiare l'immagine di un processo)....

    Se per esempio io ho il file: ex.c
    codice:
    void main(int argc, char **argc){
     printf("ciao");
    }
    e il file ll.c
    codice:
    void main(){
     int i=execl("ex","ex",(char *)0);
     printf("%s",i);
    }
    Mi stampa sempre -1....Ciò significa che non viene modificata l'immagine del processo, dove sbaglio?? Chiaritemi le idee

    Premetto che entrambi i file (ex,ll) sono nella stessa directory (Documenti) e da terminale compilo prima ll.c e poi avvio l'eseguibile a.out generato.....

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12
    nessuno

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    mi sembra che il primo argomento di execl debba essere un path completo.

    ciao
    sergio

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12
    Originariamente inviato da sebaldar
    mi sembra che il primo argomento di execl debba essere un path completo.

    ciao
    sergio
    Intanto grazie per la risposta

    Avevo già provato a mettere il path completo (nel mio caso "/home/io/Documenti/ex") però il risultato è sempre lo stesso....Per di più tra i vari manuali ho letto che il file viene sempre cercato nel direttorio corrente (a meno che ovviamente non si specifica un path completo tra i parametri dell'execl) quindi non credo sia questo il problema

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    ricontrolla bene.

    Prova questo codice
    Codice PHP:
    #include <unistd.h>
    #include <stdio.h>

    int main () {

        
    execl("/bin/ls","ls",0);
     
        
    /* se sono qui qualcosa è andato male */
        
    return (-1);



  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12
    Originariamente inviato da sebaldar
    ricontrolla bene.

    Prova questo codice
    Codice PHP:
    #include <unistd.h>
    #include <stdio.h>

    int main () {

        
    execl("/bin/ls","ls",0);
     
        
    /* se sono qui qualcosa è andato male */
        
    return (-1);


    ls è il nome di questo frammento di codice?? quindi si modifica l'immagine con una uguale...ma in questo caso non si cambia sempre immagine all'infinito dato che dopo aver cambiato immagine il programma riparte dal main entrando in un "ciclo infinito"

    ps domani comunque proverò a fare queste altre prove e a ricontrollare bene la path

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    Originariamente inviato da leo987
    ls è il nome di questo frammento di codice?? quindi si modifica l'immagine con una uguale...ma in questo caso non si cambia sempre immagine all'infinito dato che dopo aver cambiato immagine il programma riparte dal main entrando in un "ciclo infinito"

    ps domani comunque proverò a fare queste altre prove e a ricontrollare bene la path
    no, il comando ls fornisce l'elenco dei file contenuti nella directory corrente, quando richiamato senza argomenti.
    Il programma corrispondente, che si chiama appunto ls, si trova nella directory bin (su qualche sistema si può trovare in sbin).
    Per lanciare il programma che ti ho postato lo devi salvare come file source.c e da linea di programma scrivere
    codice:
    $gcc source.c
    $./a.out
    l'output sarà proprio l'elenco dei file della directory corrente.
    Se come primo argomento di execl ometti il path di ls vedrai che il programma esce senza fornirti l'elenco dei file.

    spero di essere stato chiaro

    ciao
    sergio

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12
    Originariamente inviato da sebaldar
    no, il comando ls fornisce l'elenco dei file contenuti nella directory corrente, quando richiamato senza argomenti.
    Il programma corrispondente, che si chiama appunto ls, si trova nella directory bin (su qualche sistema si può trovare in sbin).
    Per lanciare il programma che ti ho postato lo devi salvare come file source.c e da linea di programma scrivere
    codice:
    $gcc source.c
    $./a.out
    l'output sarà proprio l'elenco dei file della directory corrente.
    Se come primo argomento di execl ometti il path di ls vedrai che il programma esce senza fornirti l'elenco dei file.

    spero di essere stato chiaro

    ciao
    sergio
    Ok...perfetto; praticamente ls è quel comando che ti dà il nome dei file contenuti in quella directory....
    Domani faccio qualche prova, ti farò sapere se sbagliavo a scrivere la path nel mi esempio sopra

    grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    12
    Ho individuato il problema....

    Allora ho provato a creare una cartella EX e all'interno di questa ho creato un file ex.c e lo ho compilato generando così l'eseguibile a.out.
    In un'altra cartella LL ho creato un file ll.c con all'interno del codice il comando execl("/EX/a.out","a.out",0);
    Ho compilato il file ll.c e quando lancio l'eseguibile a.out (generato dal codice ll.c) viene cambiata l'immagine di processo e difatti nella finestra di output mi viene stampato quanto specificato nel file ex.c....

    Ora però vorrei capire se è possibile modificare il parametro "EX/a.out" dell'istruzione execl in modo che non devo ogni volta generare prima l'eseguibile del file ex.c e poi compilare il file ll.c e lanciarlo

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    nei sistemi unix la struttura del file system è più rigida che in windows. Normalmente non è accettabile creare ulteriori directory che discendono da root (per root si intende la directory radice che ha simbolo /).
    Se devi creare ulteriori directory fallo dalla tua home.

    Quando compili un sorgenti puoi definire anche un nome per l'eseguibile (se lo ometti questo si chiamerà a.out).
    La sintassi per generare l'eseguibile pippo dal sorgente pippo.c è
    $gcc -o pippo pippo.c

    Per quanto riguarda la generazione dell'eseguibile questa si fa una sola volta attraverso la compilazione .


    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.