小编典典

重新打开具有另一个访问权限的文件描述符?

linux

假设操作系统是linux。假设我打开了一个文件进行写入并获取了一个文件描述符fdw。是否有可能获得另一个文件描述符fdr,对文件进行只读访问而无需open再次调用?我不想调用的原因open是底层文件可能已被其他进程移入文件系统或什至在文件系统中未链接,因此重用相同的文件名对此类操作是不可靠的。所以我的问题是:如果仅给出文件描述符,是否仍然可以用不同的访问权限打开文件描述符?
我想dup还是dup2不会更改访问权限。


阅读 318

收藏
2020-06-02

共1个答案

小编典典

是! 诀窍是通过访问已删除的文件/proc/self/fd/n。据我所知,这只是一个Linux技巧。

运行此程序:

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

int main() {
    FILE* out_file;
    FILE* in_file;
    char* dev_fd_path;
    char buffer[128];

    /* Write “hi!” to test.txt */
    out_file = fopen("test.txt", "w");
    fputs("hi!\n", out_file);
    fflush(out_file);

    /* Delete the file */
    unlink("test.txt");

    /* Verify that the file is gone */
    system("ls test.txt");

    /* Reopen the filehandle in read-mode from /proc */
    asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file));
    in_file = fopen(dev_fd_path, "r");
    if (!in_file) {
        perror("in_file is NULL");
        exit(1);
    }
    printf("%s", fgets(buffer, sizeof(buffer), in_file));

    return 0;
}

它将一些文本写入文件,将其删除,但保持文件描述符为打开状态,然后通过其他途径重新打开它。直到拥有最后一个文件描述符的最后一个进程关闭文件才真正删除文件,直到那时,您可以通过获得文件内容/proc


感谢我的前任老板Anatoly在删除一些重要文件的过程中教给我了这个技巧,幸运的是,这些文件仍然被另一个进程附加!

2020-06-02