システム コールを使用して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 は非実行可能ファイルに適しています。