Newsgroup: it.comp.os.linux.development
Titolo: come fa un eseguibile a sapere dove si trova?

mi spiego: vorrei sapere come fa un programma in esecuzione a sapere dove si
trova il suo file. questo e' diverso da argv[0]
perche' se eseguo "ls .."
argv[0] sara' "ls" e non ad esempio /usr/bin/ls (o /bin/ls o quel che e'
insomma)
finora non credevo che questo fosse possibile in unix pero' c'e' una
funzione di kylix che permette di saperlo (mm... non ricordo ora quale
funzione, perche' non conosco bene kylix)
grazie,
Touch

 insomma)
man which
Da C, puoi fare un pipe per un comando "which argv[0]" e leggere
il risultato. Un po' ingarbugliato e poco efficente, ma funge.
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char **argv ) {
  FILE *c;
  char comando[FILENAME_MAX+7];
  char risultato[FILENAME_MAX+1];
  snprintf( comando, sizeof(comando), "which %s", argv[0] );
  if ( (c = popen(comando, "r")) == NULL ) {
    perror( "popen" );
    exit(1);
  }
  if ( fscanf( c, "%s", risultato ) != 1 ) {
    perror( "fscanf" );
    exit(1);
  }
  pclose( c );
  printf( "Il mio filename e`:%s\n", risultato );
  exit(0);
}
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labor-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 Touch
Di niente
-- 
Hasta la victoria siempre
        KeYStRoKE

> insomma)
(Per Simone)  argv[0] contiene il nome  con cui il  programma e` stato
avviato,  e  viene preso  dalla  command  line.  La cosa  torna  utile
(i.e. un eseguibile che a seconda del nome con cui e` invocato fa cose
leggermente diverse).
RD> man which
Se non erro funziona solo con i programmi contenuti in directory elencate
nel path.
-- 
Gian  | main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Uberto|                        David Korn, 1987 ioccc best one liner 
Lauri |-------------------------------------------------------------------
(aka saint) >>Vedere X-Nospam nell'header - See X-Nospam field in Header<<

 writes:
K> ma scusa,un pwd/argcv[0]?
Hmmm.... la  working directory non mi  pare sia _sempre_  (anzi, lo e`
solo in  casi particolari, quando tu in  pratica richiami ./programma)
la directory in cui e` ospitato il binario del programma.


 nel path.
No, provata e funge. Vero che funziona solo coi programmi nel path. Il punto
e` che argv[0] punta sempre al nome dell'immagine. Due casi:
a) l'immagine e` nel path -> which la trova
b) l'immagine non e` nel path -> e` stata eseguita usando il full path (/a/b/c)
   e which la trova.
Provare per credere.
$ cd /tmp
$ which try
/tmp/try
$ cd /
$ which /tmp/try
/tmp/try


 writes:
RD> e` che argv[0] punta sempre al nome dell'immagine. Due casi:
Piu` che altro la b :). 
RD> a) l'immagine e` nel path -> which la trova
RD> b) l'immagine non e` nel path -> e` stata eseguita usando il 
RD>    full path (/a/b/c)
RD>    e which la trova.
Cavolacci, non ci avevo pensato. Se  il programma lo hai lanciato o e`
nel path  o hai  dato un  path per eseguirlo.  Vero! Si  impara sempre
qualcosa.


 sapere dove si trova il suo file. questo e' diverso da argv[0]
Non ha molto senso chiedere il path. Per come sono fatti i file system 
per Unix il massimo che puoi ottenere č l'inode, il path puņ cambiare 
anche mentre tieni un file aperto, o lo stesso path puņ finire per 
puntare ad un file completamente diverso (sai che fregatura?), ma 
l'inode rimane fisso
Comunque, solo ed esclusivamente su Linux 2.2 e superiori, con una 
readlink() su /proc/[pid del processo]/exe ottieni il path completo
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 anche mentre tieni un file aperto
Questa l'ho gia' sentita, ma non l'ho capita. In un thread su come fare
un demon, qualcuno ha affermato che per non avere problemi un demon deve
cambiare la workDir cosi' "se qualche partizione viene smontata non ci
sono casini".
Io ho provato a smontare una partizione da cui avevo avviato un
processo,
il sistema (Linux 2.2) si e' incazzato: Cos'e' che non ho capito?
C:\>iao Angelo

 il sistema (Linux 2.2) si e' incazzato: Cos'e' che non ho capito?
che devi appunto fare chdir (di solito "/" ) al daemon 
se voui smontare il fs da cui l'hai avviato... altrimenti
se smonti hai problemi perche' e' attivo un processo su
quel fs...
Paolo
-- 
             Signature for rent!
          Questo spazio si affitta!
contact:
bro...@mailandnews.com