2016-03-19 7 views
3

Mein Code ist wie folgt:„Creat“ gibt Funktion falsche Berechtigungen

#include "unistd.h" 
#include <fcntl.h> 

#define BSIZE 50 

int main(int argc, char *argv[]) { 
    int f1, f2; 
    char buf[BSIZE]; 

    f1 = open(argv[1], 0x0001, 0); 
    f2 = creat(argv[2], 0777); 

    read(f1, buf, BSIZE); 
    write(f2, buf, BSIZE); 

    return 0; 
} 

Wenn ich eine Datei mit dem Namen ‚a‘ und verwenden Sie das kompilierte Programm mit dem Befehl erstellen

./a.out a b 

Es erstellt eine Datei mit dem Inhalt von 'a' in der Tat. Aber mein Problem ist, seine Berechtigungen sind -rwxr-xr-x. Es gibt keine Schreibberechtigungen für Gruppen und andere. Außerdem, wenn ich die Funktion zu creat(argv[2], 0022); ändere, würde die Erlaubnis alle 0 s ---------- werden.

Gibt es etwas falsch mit der creat Funktion? Weil chmod gut funktioniert.

Antwort

2

Dateierstellung verwendet zwei kombinierten Zugriffsberechtigungen:

  1. diejenige, die Sie durch creat zur Verfügung gestellt oder open
  2. und die Prozessmaske, aka umask

umask gibt einige abschließende Kontrolle an den Benutzer Ihres Programms, indem Sie einige Bits maskieren, um erstellte Dateien mit unerwarteten Zugriffen zu schützen. Im Allgemeinen bedeutet umask gleich 022, dass der Schreibzugriff für Gruppen und andere entfernt wird, d. H. Benutzer wollen nicht mehr als rwxr-xr-x.

Dann, wenn Sie 0777 zurückfordern, ist es maskiert (und) mit ~umask hier 0755 geben 0755. Wenn Sie 022 zurückfordern, ist maskiert (und) mit 0755 geben 000.

+0

Ihre Erklärung von 'umask' hat meine Frage sehr gut erfüllt. Vielen Dank. –

1

Dateien, die von open, creat, fopen usw. erstellt wurden, werden mit dem Standardwert umask ausgeblendet. Sie haben wahrscheinlich eine umask von 022, die einen entspannten Standardwert ist. Das Ändern der umask zu 0 wäre sehr riskant. Der richtige Ansatz besteht darin, diesen Standard explizit mit chmod zu überschreiben und Ihre Datei für Gruppenmitglieder und andere schreibbar zu machen.