[C] Path di esecuzione

di il
14 risposte

[C] Path di esecuzione

Buongiorno a tutti.

Volevo sapere se esiste un modo in C di ottenere il path dal quale viene lanciata l'applicazione.

Cerco di spiegarmi meglio con un esempio.

supponiamo io metta il mio programma in /home/pippo

quindi faccio cd ... e mi porto nella directory corretta

poi compilo ed eseguo il programma con gcc....

Esiste una funzione che mi restituisce /home/pippo

ps. sto lavorando in linux

14 Risposte

  • Re: [C] Path di esecuzione

    Puoi utilizzare la variabile globale program_invocation_name oppure più semplicemente leggere argv[0]; in entrambi i casi devi estrarne il path.
    Vedi
  • Re: [C] Path di esecuzione

    Potresti provare in questo modo:
    
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #define _GNU_SOURCE
    extern char *program_invocation_short_name;
    
    int main(int argc, char **argv)
    {
    char *buf;
    size_t size=100;
    getcwd(buf,size); // Restituisce NULL se il buffer richiesto è maggiore di size
    printf("%s/%s\n",buf,program_invocation_short_name);
    return 0;
    }
  • Re: [C] Path di esecuzione

    Banalissimo:

    argv[0]

    contiene il path completo dell'eseguibile

    Mai sottovalutare i parametri passati sulla linea di comando
  • Re: [C] Path di esecuzione

    Anche io utilizzerei argv[0] come suggerito subito da candaluar ...
  • Re: [C] Path di esecuzione

    E' quello che avevo pensato, però a me argv[0] restituisce solo il nome dell'eseguibile:
    
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    printf("%s\n",argv[0]);
    return 0;
    }
    Con questo codice ottengo:
    
    ~$ gcc foo.c -o foo
    ~$ ./foo
    ./foo
    
  • Re: [C] Path di esecuzione

    Con VC++ ottengo tutto il percorso ... ma in effetti con Linux la shell può non restituire tutto il percorso in argv[0] ma semplicemente quello che si è scritto per lanciare il programma.

    Puoi usare la readlink per leggere /proc/self/exe
  • Re: [C] Path di esecuzione

    Forse non il nome dell'eseguibile ma il path relativo dell'eseguibile.

    Probabilmente devi aggiungerci il path della directory corrente.

    Strano, pero': l'ho provato su Linux e mi da' il path completo.
    Forse da' il path che uno scrive sulla linea di comando.

    Gli IDE sono una bella cosa, ma bisogna ricordarsi che esistono !
    Probabilmente con VC++ (e nel mio caso) ritorna il path completo per il banale motivo che l'ide lancia l'eseguibile utilizzando il path completo!
  • Re: [C] Path di esecuzione

    Sì, in effetti qui dicono chiaramente che in argv[0] su Linux ti trovi ciò che hai digitato per lanciare il programma:

    http://stackoverflow.com/questions/7941536/windows-vs-linux-gcc-argv0-value

    In effetti provando con Code::Blocks, sempre utilizzando gcc come compilatore, restituisce il path completo.
    E' che imporre all'utente di lanciare un eseguibile sempre tramite il path completo non è una bella cosa, quindi converrebbe tenerne conto e non usare solamente argv[0], giusto?
  • Re: [C] Path di esecuzione

    A questo indirizzo c'è la soluzione del problema utilizzando realpath().
    Purtroppo ora non riesco a provarla, ma mi sembrava interessante.
  • Re: [C] Path di esecuzione

    La prima soluzione per Unix funziona anche su Linux, grazie
  • Re: [C] Path di esecuzione

    Grazie a tutti.

    Confermo che solo argv 0 non basta.

    Posto qui sotto il codice funzionante che sarebbe quello linkato da voi :
    
    /* For printf. */
    #include <stdio.h>
    /* For realpath. */
    #include <stdlib.h>
    /* For PATH_MAX (the maximum length of a path). */
    #include <sys/param.h>
    /* For strerror. */
    #include <string.h>
    /* For errno. */
    #include <errno.h>
    
    static void
    call_realpath (char * argv0)
    {
        char resolved_path[PATH_MAX];
    
        if (realpath (argv0, resolved_path) == 0) { 
    	fprintf (stderr, "realpath failed: %s\n", strerror (errno));
        } else {
    	printf ("Program's full path is '%s'\n", resolved_path);
        }
    }
    
    int
    main (int argc, char ** argv)
    {
        printf ("Program called as '%s'\n", argv[0]);
        call_realpath (argv[0]);
        return 0;
    }
    
    Grazie e buona giornata
  • Re: [C] Path di esecuzione

    Ciao ragazzi,

    ho un ulteriore problema che continua la medesima domanda.

    Se io eseguo il programma postato precedentemente dalla seguente directory

    /home/lorenzo/Documenti

    Qui ho il file di nome path.c che compilo ed eseguo con ./path

    Il risultato che ottengo e' : /home/lorenzo/Documenti/path

    La domanda quindi è :
    è possibile ottenere solo :

    /home/lorenzo/Documenti quindi senza ottenere anche il nome del file che eseguo?
  • Re: [C] Path di esecuzione

    Questo stampa a video il path della directory ( get current work directory) nella quale ti trovi quando esegui il programma, quindi se anziché ./foo usassi /home/lorenzo/Documenti/foo in un'altra directory ti restituirebbe il path di quest'ultima.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    int main (int argc, char *argv[])
    {
    char buff[1024];
    if( NULL!=getcwd(buff,sizeof(buff)) )
    	puts(buff);
    else
    	perror("getcwd() error");
    return 0;
    }
    
  • Re: [C] Path di esecuzione

    Light ha scritto:


    Questo stampa a video il path della directory ( get current work directory) nella quale ti trovi quando esegui il programma, quindi se anziché ./foo usassi /home/lorenzo/Documenti/foo in un'altra directory ti restituirebbe il path di quest'ultima.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    int main (int argc, char *argv[])
    {
    char buff[1024];
    if( NULL!=getcwd(buff,sizeof(buff)) )
    	puts(buff);
    else
    	perror("getcwd() error");
    return 0;
    }
    
    funziona alla grande.

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
14 risposte