[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Sti til eksekverbar



> On Tue, 22 Jul 2003, Robert Larsen wrote:
> 
> > Er det muligt at finde den fulde sti til den fil, som eksekverer ?


On Tue, 22 Jul 2003 12:44:49 +0200
Hans Schou <sslug@sslug> wrote:
> realpath() 
> 
#include <limits.h>
#include <stdlib.h>
 int main(int argc, char ** argv)
 {
    printf("%s\n",argv[0]);
    char buf[PATH_MAX];
    if (realpath(argv[0], buf))
        printf("realpath = %s\n", buf);
        return 0;
 }


Det er sørme et godt spørgsmål. Realpath fjerner symlinks, så
den del er god nok. Men hvis nu en bruger kalder program xyz
uden angivelse af fuld path (det sker;-) så får man en fejl
fra ovst. program. Så hvordan får man i første omgang i det
hele taget en fullpath til programmet? Jeg har da fx. to versioner
af "host" programmet liggende (jeg renamer nok snart den ene).

Men det er altså ikke en gang vandtæt at lave en system("which argv[0]")
(jeg ved godt at argv[0] skal erstattes inden system()!) for brugeren
kan have lavet noget med :.: i egen path eller hvad? Jeg tror ikke
at en system("which") er sikker.

Hvad så? Execve har full path. Den kan simpelt hen ikke køre uden. Og
alle de andre exec er front ends for execve. Så der *må* være
oplysninger i kernen om, hvad den fulde sti til denne her binary
executable er for noget, og de må ligge i /proc. Der finder jeg en fil
"exe" som er et symlink til min executable.

Exempelvis: 
$: echo $$ ## mit eget procnummer
16380
$:ls /proc/$$ ## vis filer i mit eget procdir
$:ls /proc/16380        
cmdline  cwd  environ  exe  fd  maps  mem  root  stat  statm  status
$:ls -lo /proc/16380/exe
lrwxrwxrwx    1 root       0 Jul 23 00:15 /proc/16380/exe -> /bin/ksh
$:ls -lo /proc/16380/exe | gawk '{ print $NF; }'
/bin/ksh
$:

Hvilket for mit vedkommende er rigtigt (jeg kan godt lide pdksh).

Der er også en /proc/$$/map file som indeholder mappings af
vores executable og afslører dennes fuldsti navn i sidste felt
første linie. Men om det så er hver gang?



Her er en ny version (for nemheds skyld kaldt realpath.c), som kan
oversættes og bruges som systemprogram. Der er også en anden utility,
som kan have interesse, namei(1).



#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char **argv)
{
    char buf[PATH_MAX];
    errno = 0;
    if (argc > 1 && realpath(argv[1], buf))
        printf("realpath = %s\n", buf);
    else {
        perror("Realpath, pathfinder error");
        exit(errno);
    }
    return 0;
}
=================================================

Demo-run:

venus:/hjem/trunk/src/cexampl #gcc -Wall realpath.c
venus:/hjem/trunk/src/cexampl #./a.out             
Realpath, pathfinder error: Success
venus:/hjem/trunk/src/cexampl #./a.out /usr/local/docs
realpath = /usr/local/docs
venus:/hjem/trunk/src/cexampl #./a.out /usr/local/doc 
realpath = /usr/local/share/doc
venus:/hjem/trunk/src/cexampl #



-- 
sslug@sslug -- Linux works for me.  http://d-axel.dk/
namei(1) betyder slå op med "man 1 namei"



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:09 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *