linux關於readlink函數獲取運行路徑的小程序


http://blog.csdn.net/djzhao/article/details/8178375
 
相關函數: stat, lstat, symlink
表頭文件: #include <unistd.h>
定義函數:int  readlink(const  char *path,  char *buf, size_t  bufsiz);
函數說明:readlink()會 將參數path的符號鏈接內容存儲到參數buf所指的內存空間,返回的內容不是以\000作字符串結尾,但會將字符串的字符數返回,這使得添加\000變得簡單。若參數bufsiz小於符號連接的內容長度,過長的內容會被截斷,如果 readlink 第一個參數指向一個文件而不是符號鏈接時,readlink 設 置errno 為 EINVAL 並返回 -1。 readlink()函數組合了open()、read()和close()的所有操作。

返回值   :執行成功則傳符號連接所指的文件路徑字符串,失敗返回-1, 錯誤代碼存於errno
錯誤代碼:
               EACCESS                  取文件時被拒絕,權限不夠
               EINVAL                    參數bufsiz為負數
               EIO                         O存取錯誤
               ELOOP                     欲打開的文件有過多符號連接問題
               ENAMETOOLONG       參數path的路徑名稱太長
               ENOENT                   參數path所指定的文件不存在
               ENOMEM                   核心內存不足
               ENOTDIR                   參數path路徑中的目錄存在但卻非真正的目錄

例一:
#include <stdio.h>
#include <unistd.h>
#define PATH_MAX 1024
char * get_exe_path()
{
    static char buf[PATH_MAX];
    int i;
 
/*  /proc/self/exe -> /a/b/c*/
    int rslt = readlink("/proc/self/exe", buf, PATH_MAX); // buf返回"/a/b/c"

    if (rslt < 0 || rslt >= PATH_MAX)
    {
        return NULL;
    }
    buf[rslt] = '\0';
    for (i = rslt; i >= 0; i--)
    {
        printf("buf[%d] %c\n", i, buf[i]);
        if (buf[i] == '/')
        {
            buf[i + 1] = '\0';
            break;
        }
    }
    return buf;
}

int main(int argc, char ** argv)
{
    printf("%s\n", get_exe_path());
    return 0;
}

例二:(個人感覺這個程序比較合理, 推薦)
#include <stdio.h>
#include <unistd.h>
char * get_exe_path( char * buf, int count)
{
    int i;
    int rslt = readlink("/proc/self/exe", buf, count - 1);
    if (rslt < 0 || (rslt >= count - 1))
    {
        return NULL;
    }
    buf[rslt] = '\0';
    for (i = rslt; i >= 0; i--)
    {
        printf("buf[%d] %c\n", i, buf[i]);
        if (buf[i] == '/')
        {
            buf[i + 1] = '\0';
            break;
        }
    }
    return buf;
}

int main(int argc, char ** argv)
{
    char path[1024];
    printf("%s\n", get_exe_path(path, 1024));
    return 0;
}
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM