スーパーユーザーのスーパー権限の確認
1714 ワード
今日、ある同僚は私に反応して、私が書いたプログラムに問題があります.問題の概略機能は、元のファイルを変更せずに新しいファイルをバックアップする必要があります(新しいファイルの最後の部分はメモリに保存されています).実現方法は簡単で、古いファイルを読み取り、新しいファイルに内容を書き、古いファイルを読み取り終わったら、メモリの一部の内容を新しいファイルに書きます.今問題が発生しました.バックアップされた新しいファイルは古いファイルよりずっと小さく、一部の内容しか見えません(メモリに保存されていた部分だと思います).同僚のパソコンでテストして、毎回再現することができますが、私のパソコンでテストするといつも再現できません.仕方なく、ユニットテストツールにunit test caseを追加してテストを追跡するしかありません.再現して、再現することができて、よく追跡して、原因はこのようにです...まず、他のスレッドに新しいファイルを修正させないように、modeを0とするモードで新しいファイルを開き(file 1と仮定し、ファイルが存在しない場合は1つ作成)、内容を書き終わるまで(メモリに保存される部分も一部あります).file 2ファイルをバックアップしてfile 1を開く必要がある場合、modeが0で読み取り不能で書き込み不可であるため、ファイルを開くのに失敗し、file 1ファイルの内容をバックアップできず、メモリ部分のみが保存されます.なぜ同僚のパソコンでは毎回再現できるのか、私のパソコンでは再現できないのか.これがスーパーユーザーのスーパー権限で、私のパソコンではrootユーザーテストを使用していますが、同僚は普通のユーザーを使用しています.例を見ればわかる(一般ユーザーとrootユーザーを使ってそれぞれ1つのファイルを作成し、modeを0に変更してファイルを読み取り、結果rootは読むことができ、一般ユーザーは読むことができない)/一般ユーザーをテストする
//rootユーザーのテスト
2つのファイルのmodeはすべて0です
これがスーパーユーザのスーパー権限であり,この例ではmodeを0に変更してもrootでプログラムを実行すると他のスレッドも読み取ることができる.他のスレッドを読みたくない場合は、modeを0に変更するのではなく、ファイルにスレッドロックを追加する必要があります.つまり、ファイルのmodeを0に変更するのは安全ではありません.他のプロセスに読ませたいのに読めない、他のスレッドに読ませたくないのに、読めるようになるかもしれません.
[welkin@dev91 ~]$ cd /tmp/
[welkin@dev91 /tmp]$ touch welkin
[welkin@dev91 /tmp]$ chmod 000 welkin
[welkin@dev91 /tmp]$ cat welkin
cat: welkin:
[welkin@dev91 /tmp]$
//rootユーザーのテスト
[root@dev91 tmp]# touch root
[root@dev91 tmp]# chmod 000 root
[root@dev91 tmp]# cat root
[root@dev91 tmp]#
2つのファイルのmodeはすべて0です
[welkin@dev91 /tmp]$ ll root welkin
---------- 1 root root 0 4 22 19:03 root
---------- 1 welkin welkin 0 4 22 19:02 welkin
[welkin@dev91 /tmp]$
これがスーパーユーザのスーパー権限であり,この例ではmodeを0に変更してもrootでプログラムを実行すると他のスレッドも読み取ることができる.他のスレッドを読みたくない場合は、modeを0に変更するのではなく、ファイルにスレッドロックを追加する必要があります.つまり、ファイルのmodeを0に変更するのは安全ではありません.他のプロセスに読ませたいのに読めない、他のスレッドに読ませたくないのに、読めるようになるかもしれません.