ファイルデスクリプタから逆にファイルパスを得る

こんなのしか思いつかなかった。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdlib.h>
#include <assert.h>
#define VERIFY(x) if (!(x)) { assert(x); abort(); }

int main(int argc, char *argv[])
{
    pid_t pid = 0;
    int fd = 0;
    char proc_path[1024];
    char path[1024];

    VERIFY(argc == 2);

    fd = open(argv[1], O_RDONLY);

    pid = getpid();
    sprintf(proc_path, "/proc/%d/fd/%d", (int)pid, fd);
    int size = readlink(proc_path, path, 1024);

    VERIFY(size > 0);

    path[size] = 0; // for null-termination

    printf("fd = %d, path = %s\n", fd, path);

    return 0;
}

実行例

$ ./a.out main.c 
fd = 3, path = /home/admin/fd_to_path/main.c