天下有风 發表於 2024-3-4 00:00:00

linux中通过文件描述符获取文件绝对路径的方法

<p>
        在linux中,有时候我们只知道文件描述符却不知道它的名字及其完整的路径,如果我们想获取其路径该怎么办呢?其实很简单,在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述符号)的文件就是文件描述符所对应的文件。说道这里我们先停下了说一个函数:</p>
<p>
        <span><strong>readlink(取得符号连接所指的文件)</strong></span></p>
<p>
        相关函数 stat,lstat,symlink</p>
<p>
        表头文件 #include &lt;unistd.h&gt;</p>
<p>
        定义函数 int readlink (const char *path, char *buf, size_t bufsiz);</p>
<p>
        函数说明 readlink()会将参数path的符号连接内容存到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将字符串的字符数返回。若参数bufsiz小于符号连接的内容长度,过长的内容会被截断。</p>
<p>
        返回值 执行成功则传符号连接所指的文件路径字符串,失败则返回-1,错误代码存于errno。</p>
<p>
        错误代码 EACCESS 取文件时被拒绝,权限不够</p>
<p>
        EINVAL 参数bufsiz 为负数<br>
        EIO I/O 存取错误。<br>
        ELOOP 欲打开的文件有过多符号连接问题。<br>
        ENAMETOOLONG 参数path的路径名称太长<br>
        ENOENT 参数path所指定的文件不存在<br>
        ENOMEM 核心内存不足<br>
        ENOTDIR 参数path路径中的目录存在但却非真正的目录。</p>
<p>
        <br><span><strong>综合上述得出如下简单函数来获取文件路径:</strong></span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_4724">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">std::string get_file_name (const int fd)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (0 &gt;= fd) {</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">return std::string ();</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">char buf = {'\0'};</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">char file_path = {'0'}; // PATH_MAX in limits.h</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">snprintf(buf, sizeof (buf), "/proc/self/fd/%d", fd);</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">if (readlink(buf, file_path, sizeof(file_path) - 1) != -1) {</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">return std::string (file_path);</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">}</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                         </div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="xhtml spaces">  </code><code class="xhtml plain">return std::string ();</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        以上这篇linux中通过文件描述符获取文件绝对路径的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。</p>
頁: [1]
查看完整版本: linux中通过文件描述符获取文件绝对路径的方法