Newsgroup: it.comp.os.linux.development
Titolo: risalire al percorso dell'eseguibile

ciao pinguini!
ecco il quesito della settimana...
ho un file eseguibile nella directory  /pippo/programma/eseguibile
per farlo partire da console digito (sono in /pippo/programma) ./eseguibile
tutto bene fin qui...
se pero' digito (sono in / ) ./pippo/programma/eseguibile
il programma parte ma non trova i file di dati che stanno nella cartella
/pippo/programma/data/...
...perche' va a cercare nella directory sbagliata!
Come faccio a capire in quale directory si trova l'eseguibile, in modo che
possa caricare dei file usando path relativi?
azz, come mi sono spiegato male... =)
TIA
--
---
Alessandro >>CoMiX<< Cominu
e-mail: 
aco...@tiscalinet.it
Icq: 116354077
Linux User # 203765
[That's not a bug, that's a feature..]
--
---
Alessandro >>CoMiX<< Cominu
e-mail: 
aco...@tiscalinet.it
Icq: 116354077
Linux User # 203765
[That's not a bug, that's a feature..]

 che possa caricare dei file usando path relativi?
man dirname, credo faccia al caso tuo.
Ciao.
-- 
***  Per E-mail rimuovi ModE dall'indirizzo  ***
  *** Linux user # 198661 --- ICQ 33500725 ***
*** homepage 
http://web.tiscalinet.it/kailed
 ***
            *** Powered by Linux ***

 Ciao.
grazie, pero' dirname e' un comando per la shell!
a me servirebbe una funzione in C/C++, o forse intendi dire che devo crearmi
uno script per l'avvio del programma?


 TIA
man getcwd
e Analizza il valore agrg[0] passato alla main; dovrebbe contenere il 
percorso dato dalla console dell'eseguibile. Correlando i 2 dati riesci a 
sapere dove andare a paecsare i dati.

 uno script per l'avvio del programma?
Non credo servirebbe a molto. dirname (che dovrebbe essere anche un
funzione di libc)
stampa il percorso di un file di cui e' stato dato il nome completo, se
viene dato
solo il nome del file stampa `.' (e non mi sembra quello che tu stia
cercando).
Per risolvere il tuo problema non (mi risulta) esitono soluzioni
preconfezionate,
quelle che mi vengono in mente sono:
- avvio di un sottoprocesso di cui e' stato ridiretto su una pipe stdin
e stdout e exec
  di which;
- lettura della variabile di ambiente PATH (es. mediante getenv),
spezzettamento della
  stringa restituita, accodamento del nome del file,
fopen("nomeCompletoDelFile", "r")
  e controllo del risultato di fopen: quando non ottieni piu' errore hai
trovato il
  path del file [1].
C:\>iao Angelo.
[1] E questo non e' sempre vero perche' potresti avere il permesso di
    eseguire un file ma non di leggerlo.

 che possa caricare dei file usando path relativi?
Il path completo del programma č un'informazione che si puň trovare in
/proc sotto forma di symlink (/proc/<pid>/exe).
Probabilmente c'č qualche altro sistema piů portabile per ottenerla.
Ad ogni modo, la seguente tecnica dovrebbe funzionare sotto Linux:
 int
 getmypath( char* result, int len )
 {
  char buffer[ 20 ];
  int rc;
  snprintf( buffer, 20, "/proc/%d/exe", getpid() );
  rc = readlink( buffer, result, len );
  result[ rc > 0 ? rc : 0 ] = '\0';
  return rc;
 }
 
 char path[N];
 getmypath(path,N);
 
M


MS Outlook : (noun) A newsreader with support for RAID 0.
MS Works   : (noun) An oxymoron.

 ...perche' va a cercare nella directory sbagliata!
Benvenuto nel meraviglioso modo di Unix. No, non stai sbagliando nulla: 
non č definito alcun modo per risalire al programma da cui il processo 
attuale č stato generato. Avrai notato difatti che la maggior parte dei 
programmi richiede che sia tu a dirgli dove si trova, generalmente nella 
fase di configurazione pre-compilazione. Oh sě, c'č il file system proc, 
ma č un file system: deve essere compilato il supporto nel kernel, deve 
essere montato
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 essere montato
Porca trota! ;)
vabbe' mi sa che senza file di configurazione non se ne esce...
Grazie a tutti
Ciao


 crearmi uno script per l'avvio del programma?
No dirname e` una funzione C:
man 3 dirname
       #include <libgen.h>
       char *dirname(char *path);
       char *basename(char *path);
ma non fa quello che ti serve.
Credo tu possa fare la cosa combinando la directory corrente (se non l'hai 
cambiata) e argv[0], altrimenti devi ricorrere a /proc
Ciao
Simone

...perche' va a cercare nella directory sbagliata!
C ne mastico poco, ma alla shell figlia che ti esegue il programma
non puoi darglielo a lei il comando/istruzione di cambiare directory
di lavoro?
Da riga di comando funzia, si muove solo lei:
cd /pippo/programma
./eseguibile
possibile che non ci sia l'equivalente in C? Oppure non c'ho capito un
tubo di quello che chiedi? :-((
-- 
Ci sentiamo  |  Remigio Zedda  || Attenzione! campo "From:" alterato
ciao Remigio |                 ||==> E-mail: 
remi...@tiscalinet.it
-------------|      ..si` d'accordo.. ma con la Deb e` un'altra cosa!
/* Linux 2.2.19pre17 su Debian GNU/Linux 2.2 Potato */

 aveva scritto qualcosa
riguardo al path di un eseguibile...
...e la soluzione più pigra è:
#include <unistd.h>
int main(int argc, char* argv[]) {
 char str_cwd[256];
 if (argv[0][0] == '/')
  printf("%s\n",argv[0]);
 else
  if (getcwd(str_cwd,256) != NULL)
   printf("%s/%s\n",str_cwd,argv[0]);
 return 0;
}
[POST TEST]
-- 
Teòria
...e il "doit" di control.ctl