GNU/Linux >> Linux の 問題 >  >> Linux

別のアクセスでファイル記述子を再度開きますか?

はい!トリックは /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 を介してファイルの内容を取得できます。 .

幸いなことに、別のプロセスによってまだ追加されているいくつかの重要なファイルを削除したときに、このトリックを教えてくれた古い上司のアナトリーに感謝します!


いいえ、fcntl 呼び出しでは、開いているファイル記述子に読み取り/書き込みビットを設定できません。既存のファイル記述子から新しいファイル記述子を取得する唯一の方法は、複製機能を使用することです。 dup/dup2/dup3 (および fcntl の呼び出し) ) ファイル アクセス モードを変更することはできません。

注:これは Linux には当てはまりますが、他の Unix 全般には当てはまりません。たとえば、HP-UX では [(1) と (2) を参照] fcntl で読み取り/書き込みビットを変更できます。 開いているファイル記述子で F_SETFL を使用します。 dup によって作成されたファイル記述子以降 同じステータス フラグを共有しますが、一方のアクセス モードを変更すると、必然的に他方のアクセス モードも変更されます。


Linux
  1. パターンに一致する行を別のファイルの行に順番に置き換えますか?

  2. 改行をNulに置き換えますか?

  3. Linuxでのファイルパーミッションと例

  1. Git でファイルのアクセス許可を保持する

  2. 別のスレッドからスレッドローカルにアクセスする

  3. あるファイルの内容を別のファイルで検索する

  1. ワイルドカード ファイル パターンを指定した tar -C

  2. ddを使用してFFでファイルをパディングする方法は?

  3. gnuplot で .gnu ファイルをプロットする