经常看到有人提问在linux中如何获取当前应用程序的绝对路径, 却很少有人能比较好的解答. 现转贴上的一篇文章, 希望能对受这个问题困扰的人有帮助.



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 & microcat
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---------------------