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_IRWXU
00700
ist, wenn Sie also richtig, dass, um 6 verschieben Sie tun7
zu bekommen. Ebenso ist S_IRWXG
00070
, 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.
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