basic coder » linux下获取当前程序的绝对路径

系统 1749 0

basic coder » linux下获取当前程序的绝对路径

linux下获取当前程序的绝对路径

2010年2月25日
发表评论
阅读评论
5,072 人阅读过  

 

在linux下运行的程序经常需要获取自己的绝对路径,程序可能需要引用外部的资源文件,比如在../skin/目录下的图片,这样普通程序是没有问题,但当程序在安装到/usr/bin/目录中,或者为程序建立连接以后就会出现问题,我们可以直接通过运行程序的链接来运行程序,这样../skin/目录就找不到了,因为当前目录并不是程序所在的目录,而且链接所在的目录,所以在它的上一级目录中根本找不到skin目录,所以就需要获取程序的绝对路径,用到了一个函数readlink,原型如下:

                  1
2
3

                
                  
                    #include <unistd.h>
                  
                  
 
ssize_t readlink
                  
                    (
                  
                  
                    const
                  
                  
                    char
                  
                  
                    *
                  
                  restrict path 
                  
                    ,
                  
                  
                    char
                  
                  
                    *
                  
                  restrict buf 
                  
                    ,
                  
                   size_t bufsize
                  
                    )
                  
                  
                    ;
                  
                

该函数的作用是读取符号链接的原路径,将它存到buf中,返回添充到buf中的字节数。

                  1
2
3
4
5
6
7
8
9
10
11
12
13
14

                
                  
                    #include <unistd.h>
                  
                  
                    #include <stdio.h>
                  
                  
 

                  
                    int
                  
                   main
                  
                    (
                  
                  
                    int
                  
                   argc 
                  
                    ,
                  
                  
                    char
                  
                  
                    *
                  
                   argv
                  
                    [
                  
                  
                    ]
                  
                  
                    )
                  
                  
                    {
                  
                  
                    char
                  
                   buf
                  
                    [
                  
                  
                    1024
                  
                  
                    ]
                  
                  
                    =
                  
                  
                    {
                  
                  
                    0
                  
                  
                    }
                  
                  
                    ;
                  
                  
                    int
                  
                   n
                  
                    ;
                  
                  
 
	n 
                  
                    =
                  
                   readlink
                  
                    (
                  
                  
                    "/bin/mail"
                  
                  
                    ,
                  
                   buf 
                  
                    ,
                  
                  
                    sizeof
                  
                  
                    (
                  
                  buf
                  
                    )
                  
                  
                    )
                  
                  
                    ;
                  
                  
                    if
                  
                  
                    (
                  
                   n 
                  
                    >
                  
                  
                    0
                  
                  
                    &&
                  
                   n 
                  
                    <
                  
                  
                    sizeof
                  
                  
                    (
                  
                  buf
                  
                    )
                  
                  
                    )
                  
                  
                    {
                  
                  
                    printf
                  
                  
                    (
                  
                  
                    "%s
                    
                      \n
                    
                    "
                  
                  
                    ,
                  
                   buf
                  
                    )
                  
                  
                    ;
                  
                  
                    }
                  
                  
                    }
                  
                

程序运行后输出:/usr/bin/mailx

linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径,如下:

                  1
2
3
4
5
6
7
8
9
10
11
12
13
14

                
                  
                    #include <unistd.h>
                  
                  
                    #include <stdio.h>
                  
                  
 

                  
                    int
                  
                   main
                  
                    (
                  
                  
                    int
                  
                   argc 
                  
                    ,
                  
                  
                    char
                  
                  
                    *
                  
                   argv
                  
                    [
                  
                  
                    ]
                  
                  
                    )
                  
                  
                    {
                  
                  
                    char
                  
                   buf
                  
                    [
                  
                  
                    1024
                  
                  
                    ]
                  
                  
                    =
                  
                  
                    {
                  
                  
                    0
                  
                  
                    }
                  
                  
                    ;
                  
                  
                    int
                  
                   n
                  
                    ;
                  
                  
 
	n 
                  
                    =
                  
                   readlink
                  
                    (
                  
                  
                    "/proc/self/exe"
                  
                  
                    ,
                  
                   buf 
                  
                    ,
                  
                  
                    sizeof
                  
                  
                    (
                  
                  buf
                  
                    )
                  
                  
                    )
                  
                  
                    ;
                  
                  
                    if
                  
                  
                    (
                  
                   n 
                  
                    >
                  
                  
                    0
                  
                  
                    &&
                  
                   n 
                  
                    <
                  
                  
                    sizeof
                  
                  
                    (
                  
                  buf
                  
                    )
                  
                  
                    )
                  
                  
                    {
                  
                  
                    printf
                  
                  
                    (
                  
                  
                    "%s
                    
                      \n
                    
                    "
                  
                  
                    ,
                  
                   buf
                  
                    )
                  
                  
                    ;
                  
                  
                    }
                  
                  
                    }
                  
                
                  1
2

                
                  ouclwp
                  
                    @
                  
                  darkstar:~
                  
                    /
                  
                  socket$ .
                  
                    /
                  
                  
                    read
                  
                  
                    /
                  
                  home
                  
                    /
                  
                  ouclwp
                  
                    /
                  
                  socket
                  
                    /
                  
                  
                    read
                  
                

basic coder » linux下获取当前程序的绝对路径


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论