ディレクトリの権限に関して奇妙な問題があります。
C++ アプリ内から、次のフォルダーを作成します。
mkdir( "foldername", 777 );
しかし、そのフォルダにファイルを作成しようとしたときに問題が発生し、fopen()
が返されNULL
、 とerrno
表示されましたPermission denied
。そこで確認したところ、確かに、作成されたフォルダには次の権限がありました。dr----x--t
(ルートフォルダにはdrwxrwxr-x
)
調べたところ、この異常はt
「一時的」という意味ですが、それが何を意味するのか全く分かりません。
chmod 777 foldername
シェルから を実行すると、属性が に設定されますdrwxrwxrwx
が、毎回手動で実行することはできません。
質問: 何が起こっているのか手がかりはありますか? アプリがフォルダー属性を正しく設定しないのはなぜですか? この「一時的」属性の意味は何ですか?
(システムはUbuntu 12.04です)
答え1
t
「一時的」ではない場合、スティッキー ビットが設定されていることを意味しますman ls
。
t [は] スティッキービットが設定され (モード 1000)、検索可能または実行可能であることを意味します。 (chmod(1) または sticky(8) を参照してください。)
スティッキービットはここで設定されているので、小数点777(8進数1411)ではなく8進数0777
777 (10 進数では 511)。ではなく 8 進数を使用して記述する必要があります777
。
また、このmode
引数の最終的な効果には、 mkdir
umask に対する AND 演算も含まれることに注意してください。man 2 mkdir
引数 mode は使用する権限を指定します。これは通常どおりプロセスの umask によって変更されます。作成されたディレクトリの権限は (mode & ~umask & 0777) になります。
これが影響する場合は、モード引数を使用する代わりに、をchmod
使用することをお勧めします。mkdir
最後に警告しておきますが、モード777はほぼ一度もない本当にやりたいことを明確にしてください。ディレクトリをすべてのユーザーにグローバルに公開するのではなく、ディレクトリに適切なモードと所有者/グループを設定することを検討してください。より複雑なルールが必要な場合は、ACL の使用を検討してください。
答え2
777
C は 10 進数です。80777
進数として扱われるように を使用する必要があります。
答え3
おそらく、モードには 10 進数ではなく 8 進数を使用することをお勧めします。
mkdir( "foldername", 0777 );
次に、umask実際にこれらの権限で inode を作成できることを確認するための設定です。
参考文献:
mkdir マニュアルページ:http://man7.org/linux/man-pages/man2/mkdir.2.html
答え4
他の素晴らしい回答に加えて、フォルダーを作成する前に設定することumask
で000
、必要な正しい権限を取得できます。
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
例:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
注記
8 進モードを使用する代わりに、次の POSIX マクロを使用できますmkdir
。
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);