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

ファイル記述子を強制的に閉じる最も安全な方法

<ブロック引用>

/dev/null を O_WRONLY で開き、次に dup2 を実行して問題のあるファイル記述子を閉じ、その記述子を /dev/null に再利用します。この方法では、ファイル記述子への読み取りまたは書き込みはすべて失敗します。

記述子を /dev/null に複製した場合 、書き込みは失敗しません 、しかし成功 、読み取りは成功します 0 (eof) を返します。

これはあなたが望むものかもしれませんし、そうでないかもしれません.

Linux では、flags =3 (O_WRONLY|O_RDWR) のファイルを開くこともできます。 別名 O_NOACCESS ) これにより、読み取りまたは書き込みが EBADF で失敗します。 .

ファイルは ioctl でのみ使用できます。これにより、他の回答やコメントで説明されていない危険が生じます。ファイル記述子に対して実行される操作は、読み取りと書き込みだけではありません。 (lseek はどうですか? または ftruncate ?).

更新:

文書化されていない O_WRONLY|O_RDWR よりも優れたものを見つけました :O_PATH = 010000000 / 0x200000 . open(2) マンページによると:

O_PATH (since Linux 2.6.39)
     Obtain a file descriptor that can be used for two  purposes:  to
     indicate a location in the filesystem tree and to perform opera-
     tions that act purely at the file descriptor  level.   The  file
     itself  is not opened, and other file operations (e.g., read(2),
     write(2), fchmod(2), fchown(2), fgetxattr(2), mmap(2)) fail with
     the error EBADF.

    The  following operations can be performed on the resulting file
     descriptor:

    *  close(2); fchdir(2) (since Linux 3.5); fstat(2) (since  Linux
        3.6).

    *  Duplicating  the  file  descriptor (dup(2), fcntl(2) F_DUPFD,
        etc.).

Linux
  1. Linuxでファイルとディレクトリを隠す簡単な方法

  2. ファットファイルシステムを最適化する賢い方法は?

  3. クラウドバックアップとローカルバックアップ:データを保存する最も安全な方法

  1. C でファイル記述子からファイル名を取得する

  2. シェルでファイルサイズ(バイト単位)を取得するポータブルな方法は?

  3. Linuxでタブ区切りファイルをcsvに変換する最速の方法

  1. Linux ファイル記述子の制限はどのように機能しますか?

  2. inotify を使用する適切な方法は何ですか?

  3. ファイル記述子とミューテックスの両方を待ちたいのですが、これを行うための推奨される方法は何ですか?