readlink


 

readlink命令

標簽: ubuntulinux工具file
 分類:
 

readlink是Linux系統中一個常用工具,主要用來找出符號鏈接所指向的位置。

在Ubuntu系統中執行以下命令:

[plain]  view plain copy
 
  1. $ readlink --help  

可以查看readlink命令的幫助信息,或者執行

[plain]  view plain copy
 
  1. $ man readlink  
查看幫助手冊。

 

從幫助信息中可以得到readlink命令的用途描述:

輸出符號鏈接值或者權威文件名

英文為:

print value of a symbolic link or canonical file name

 

舉例:

系統中的awk命令到底是執行哪個可以執行文件呢?

[plain]  view plain copy
 
  1. $ readlink /usr/bin/awk  
  2. /etc/alternatives/awk  ----> 其實這個還是一個符號連接  
  3. $ readlink /etc/alternatives/awk  
  4. /usr/bin/gawk  ----> 這個才是真正的可執行文件  

-f 選項:

-f 選項可以遞歸跟隨給出文件名的所有符號鏈接以標准化,除最后一個外所有組件必須存在。

簡單地說,就是一直跟隨符號鏈接,直到直到非符號鏈接的文件位置,限制是最后必須存在一個非符號鏈接的文件。

[plain]  view plain copy
 
  1. $ readlink -f /usr/bin/a

 

 

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