13.12 如何获取当前进程对应之静态映像文件的绝对路径
A: hushui110@水木清华
这是一个x86/Linux Kernel 2.4.7-10系统中利用proc获取绝对路径的例子
--------------------------------------------------------------------------
/*
* gcc -Wall -pipe -g -static -o myprog_2 myprog_2.c
*/
#include
#include
#include
#define MAXBUFSIZE 1024
int main ( int argc, char * argv[] )
{
char buf[ MAXBUFSIZE ];
int count;
count = readlink( "/proc/self/exe", buf, MAXBUFSIZE );
if ( count < 0 || count >= MAXBUFSIZE )
{
printf( "Failed\n" );
return( EXIT_FAILURE );
}
buf[ count ] = '\0';
printf( "/proc/self/exe -> [%s]\n", buf );
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------
[scz@ /home/scz/src]> echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:.
[scz@ /home/scz/src]> ./myprog_2
/proc/self/exe -> [/home/scz/src/myprog_2]
[scz@ /home/scz/src]> ../src/myprog_2
/proc/self/exe -> [/home/scz/src/myprog_2]
[scz@ /home/scz/src]> myprog_2
/proc/self/exe -> [/home/scz/src/myprog_2]
[scz@ /home/scz/src]>
显然这里直接给出了最期待的结果,没有冗余信息。
A: scz
2000-03-18
下面在x86/Linux Kernel 2.4.7-10上演示、讨论
--------------------------------------------------------------------------
*
* gcc -Wall -pipe -g -static -o myprog myprog.c
*/
#include
#include
int main ( int argc, char * argv[] )
{
return( EXIT_SUCCESS );
} /* end of main */
--------------------------------------------------------------------------
[scz@ /home/scz/src]> gcc -Wall -pipe -g -static -o myprog myprog.c
[scz@ /home/scz/src]> echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:.
[scz@ /home/scz/src]> gdb ./myprog
(gdb) b main
(gdb) r
(gdb) x/17s 0xbfffff00
0xbfffff00: "SHLVL=1"
0xbfffff08: "_=/bin/bash"
0xbfffff14: "SHELL=/bin/bash"
0xbfffff24: "HOSTTYPE=i386"
0xbfffff32: "OSTYPE=linux-gnu"
0xbfffff43: "HISTSIZE=1000"
0xbfffff51: "TERM=vt100"
0xbfffff5c: "HOME=/home/scz"
0xbfffff6b: "SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass"
0xbfffff9e: "PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:."
0xbfffffd2: "LESSCHARSET=latin1"
0xbfffffe5: "/home/scz/src/./myprog" <-- 注意这个输出
0xbffffffc: ""
0xbffffffd: ""
0xbffffffe: ""
0xbfffffff: ""
0xc0000000: -Linux伊甸园。如不注明,将根据《互联网著作权行政保护办法》追究其相应法律责任。
--------------------next---------------------