umask() システムコールが権限をマスクする方法

umask() システムコールが権限をマスクする方法

システム コールを使用してumask()ファイルの権限を設定しています。次のコードを使用しています:

umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);

しかし、実行後、以下の権限でファイルが作成されます

--wS-----T 1 rvi rvi     0 Oct  2 15:20 test.txt

このSビットとTビットは何のためにあるのですか? また、なぜ自動的に変更されるのですか?

答え1

O_CREAT で open を呼び出すと、ファイルのモードを表す 3 番目の引数が必要になります。その後、要求したモードから umask がマスクされます。たとえば、次のようになります。

umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);

フラグ 0777 & (~0022) = 0755、つまり rwxr-xr-x を持つファイルを作成します。

umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);

フラグ 0666 & (~0022) = 0644、つまり rw-r--r-- を持つファイルを作成します。あなたの場合、モード引数を指定していないため、open 関数はスタックからランダム データを取得するため、umask でマスクされたビットがオフになることだけがわかります。open 呼び出しに希望のモードを指定してみてください。0777 は実行可能ファイルには適しており、0666 は非実行可能ファイルに適しています。

関連情報