2016-07-16 4 views
0

S_IWGRP und S_IWOTH Flags keine Wirkung, wenn in angegeben.Aufruf zu öffnen (2) ignoriert S_IWGRP und S_IWOTH Flags

Datei geöffnet und erstellt als

open(file,O_CREAT|O_WRONLY,S_IWGRP|S_IWOTH); 

, die in

---------- 1 root root 0 Jul 16 21:25 file 

alle anderen Flaggen ordnungsgemäß funktioniert führt.

Wo soll ich die Fehlersuche starten?

Antwort

0

Sie müssen die Prozesse umask Wert berücksichtigen. Siehe man 2 umask.

Der Umask-Wert wird von der Berechtigungsmaske abgezogen, die an übergeben wurde. Das heißt, wenn Sie open(file,O_CREAT|O_WRONLY,mymask) tun, dann ist die tatsächliche Maske nichtmymask aber mymask & ~umask. Die meisten Benutzer beginnen mit einem umask-Wert von 022 [oktal], der S_IWGRP | S_IWOTH ist.

Der Umask-Wert eines Benutzers kann durch den Befehl shell builtin umask gesteuert werden.

Ein Prozess kann den umask-Wert über den umask(2) Syscall ändern. In Ihrem Fall versuchen:

oldval = umask(0); 
open(...); 
umask(oldval); 

Hinweis: Dieses in einer Single-Threaded-Umgebung funktioniert gut, aber zusätzliche Schritte sollten mit einem Multi-Thread-Programm genommen werden.

Eine andere Möglichkeit ist die Verwendung fchmod:

fd = open(...); 
fchmod(fd,mymask); 

Dies ist wahrscheinlich sicherer für Multi-Thread, aber wenn das Programm bricht zwischen dem open aber vor dem fchmod, werden Sie mit der gleichen Situation am Ende wie Sie (zB Nullmaske). So kann ein <CTRL-C>, Systemabsturz usw., der gut zeitlich abgestimmt ist, dies erzeugen.


UPDATE:

Ich bin verwirrt darüber, weil, wenn ich den realen Wert der S_IRWXU Flagge Druck bin ich ein 442 erhalten.Warum es nicht nur eine Nummer 7

Ich bin mir nicht ganz sicher, denn ich weiß nicht, ob 442 dezimal oder oktal war, aber ich werde versuchen, alle Grundlagen abzudecken [Wortspiel beabsichtigt :-) ].

das Layout einer Berechtigungen maskieren, die normalerweise in Oktal ["%o" Format] gedruckt wird, ist:

owner(3) | group(3) | other(3) 

Das heißt, jedes 3 Bit breit

ist

Die S_IRWXU definieren einen festen ist Definieren Sie für "alle Besitzer Berechtigungen". Es hat einen Oktalwert von , der 448 Dezimal ist. Also, wenn wurden Sie printf("%d\n",S_IRWXU) tun Ich würde erwarten, dass die 448

printf("%d\n",mask & S_IRWXU) [oder sogar printf("%d\n",mask & S_IRWXU)] kann nicht produzieren 442 weil dass Dezimalwert ist Oktal 672. Die 672 würde bis 600 oktal oder 384 dezimal maskiert werden. Aber das ist nicht möglich.

Also, wenn der Dezimalwert waren wirklich448 und nicht442 dieses 700 Oktal ergibt das bedeutet „Eigentümer hat alle Berechtigungen“

Also, der einzige Weg, dass die Dinge Sinn für mich ist, dass die 442 war der Oktalwert für die gesamte Berechtigungsmaske [und wurde gegen 777 oktal maskiert].

Um zu klären, ist hier eine Datei Snippet stat.h, die definiert die verschiedenen Werte [von mir wurden die Kommentare hinzugefügt]:

#define S_IRWXU 00700  // mask for owner 
#define S_IRUSR 00400  // owner may read 
#define S_IWUSR 00200  // owner may write 
#define S_IXUSR 00100  // owner may execute 

#define S_IRWXG 00070  // mask for group 
#define S_IRGRP 00040  // group may read 
#define S_IWGRP 00020  // group may write 
#define S_IXGRP 00010  // group may execute 

#define S_IRWXO 00007  // mask for others 
#define S_IROTH 00004  // others may read 
#define S_IWOTH 00002  // others may write 
#define S_IXOTH 00001  // others may execute 

So 442 ist r|r|w die Eigentümer und die Gruppe sagen, lesen und andere können kann schreibe [aber nicht lesen]. Dies würde für eine gegebene Datei nicht viel Sinn ergeben, so bedeutet dies, dass die betreffende Maske der umask Wert ist. Aber selbst dann macht dies immer noch keinen Sinn, denn als umask Wert, Entfernen Leseberechtigung für den Besitzer ist nicht die übliche Sache zu tun.

Beachten Sie, dass S_IRWXU00700 ist, wenn Sie also richtig, dass, um 6 verschieben Sie tun7 zu bekommen. Ebenso ist S_IRWXG00070, also wenn Verschiebung nach rechts, dass von 3, auch 7

Wahrscheinlicher Sie erhalten, der Wert, den Sie gegen maskieren möchten sind S_IRWXG | S_IRWXO [group/andere], denn das ist, was Sie in außer Kraft zu setzen versuchen, Ihre ursprüngliche Frage.

Wenn Sie immer noch Probleme haben und ein wenig mehr klären können, was Sie tun, um den Wert zu erhalten, kann ich dies eventuell weiter überarbeiten, um zu helfen.

+0

Definitiv die richtige Richtung! Können Sie mir vorschlagen, wie ich den Berechnungsalgorithmus verstehen kann? Ich bin verwirrt darüber, weil, wenn ich den realen Wert von S_IRWXU Flagge drucke ich einen 442 bekomme. Warum ist es nicht nur eine Nummer 7? – l00p

0

Wenn eine Datei erstellt wird, werden ihre Berechtigungsbits durch das Komplement der aktuellen umask maskiert. Wenn also umask auf 022 (ein typischer Wert) gesetzt wurde, werden die Berechtigungen durch 0755 maskiert (bitweise-verknüpft).

Wenn Sie Dateien wirklich benötigen, um Gruppen-/Weltschreibberechtigungen im Moment der Erstellung zu haben, können Sie umask(0) aufrufen, aber das ist in der Regel schlecht, da die Einstellung process-global ist und an anderen Stellen zu unsicheren Dateierstellungen führen kann (oder in Ihren Kindprozessen). Ein besserer Ansatz ist, wenn er funktioniert, nur fchmod nach dem Öffnen der Datei aufzurufen, um die Berechtigungen hinzuzufügen, die maskiert wurden.