当前位置: 首页 > 面试题库 >

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

公孙栋
2023-03-14
问题内容

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


问题答案:

是! 诀窍是通过访问已删除的文件/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在删除一些重要文件的过程中教给我了这个技巧,幸运的是,这些文件仍然被另一个进程附加!



 类似资料:
  • 我正在使用Unity游戏引擎创建游戏。在这个游戏中,我抓取了一个屏幕截图,并将其保存到Unity的默认文件夹(“Application.PersistentDataPath”): /data/data/de.mytest.mygame/files/screenshot.png 如何修复此权限问题? 编辑:创建意图如下所示:

  • 好的,这是我目前的build.gradle: 这就是配置。格拉德尔: 问题是:为什么我可以从config.gradle.访问howManyTables任务,但不能访问定义的变量?我想创建具有预定义值的自定义config.gradle。然后在我的Android应用程序中使用它们作为变量。(他们,根据这些数据建立了我的逻辑。无论如何,我希望这个问题很清楚;)有什么想法吗?

  • 问题内容: 我正在Linux C项目上工作,无法使用文件描述符。 我有一个孤立的文件描述符(文件是open()然后是unlink(),但是fd仍然很好),它具有只写权限。原始备份文件具有完全权限(使用S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH创建),但是可惜文件是用O_WRONLY打开的。是否可以复制文件描述符并将副本更改为O_RDWR? 伪代码: 提前致谢!-安德

  • 问题内容: 我正在编写一个函数,给定一个参数,该函数将把stdout重定向到文件或从文件中读取stdin。为此,我关闭与stdout或stdin关联的文件描述符,以便在我打开文件时,它在刚关闭的描述符下打开。这行得通,但是问题是,一旦完成,我就需要将stdout和stdin恢复到它们真正应该的样子。 我可以为stdout做的事情是open(“ / dev / tty”,O_WRONLY); 但是我

  • 本文向大家介绍具有公共文件访问权限集的Drupal私有文件下载,包括了具有公共文件访问权限集的Drupal私有文件下载的使用技巧和注意事项,需要的朋友参考一下 Drupal有两种允许用户下载文件的方式,它们是私有的和公共的。 在公开的情况下,任何人都可以打开文件,而Drupal则不参与下载过程。这意味着下载文件时不会记录任何统计信息或使用权限。每个文件均按名称引用。 私有文件访问意味着每次下载文件

  • 当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为文件句柄)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管