Ich verwende umask()
Systemaufrufe, um die Dateiberechtigung festzulegen. Ich verwende den folgenden Code:
umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);
Aber nach der Ausführung wird eine Datei mit den unten angegebenen Berechtigungen erstellt
--wS-----T 1 rvi rvi 0 Oct 2 15:20 test.txt
Wofür ist dieses S
Bit und T
Bit? Und warum wird es automatisch geändert?
Antwort1
Wenn Sie open mit O_CREAT aufrufen, wird ein drittes Argument für den Modus der Datei erwartet. Die Umask wird dann aus dem von Ihnen angeforderten Modus herausmaskiert. Also zum Beispiel:
umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);
würde eine Datei mit den Flags 0777 & (~0022) = 0755 erstellen, also rwxr-xr-x, wobei:
umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);
würde eine Datei mit den Flags 0666 & (~0022) = 0644 erstellen, also rw-r--r--. In Ihrem Fall nimmt die Open-Funktion zufällige Daten vom Stapel, da Sie kein Modusargument angegeben haben. Sie wissen also nur, dass die mit umask maskierten Bits deaktiviert sein werden. Versuchen Sie, dem Open-Aufruf den gewünschten Modus anzugeben. 0777 ist eine gute Wahl für ausführbare Dateien und 0666 für nicht ausführbare Dateien.