PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dringend: umask / chmod in C



Danny4
14-01-2006, 19:05
Hallo, bis zu einer Prüfung am Montag hoffe ich auf Hilfe.

Das Prinzip von chmod & umask ist mir eugentlich klar. 777 - 022 = 755. Nun habe ich folgenden C-Quelltext:

#include <stdio.h>
int main()
{
umask(022);
int fd1 = creat("a.txt", 0731);

umask(156);
int fd2 = creat("b.txt", 0731);
}

Nach dem Compilieren und Ausführen habe ich folgende Rechte auf den Dateien:
a.txt: -rwx--x--x
b.txt: -r-x-----x

Das sind für a.txt 711 und für b.txt 501

731 ist ja rwx-wx--x.

Mit der 711 gehe ich noch mit, aber wieso kommt für b.txt 501 raus?


731: rwx -wx --x
022: 000 010 010
----------------
711: rwx --x --x

aber:
731: rwx -wx --x
156: 001 101 110
----------------
621: rw- -w- --x ??? oder doch 501 ???

Vielleicht habe ich ja nur einen Balken vorm Kopf. Hoffe das mir jemand schnell helfen kann.

anda_skoa
14-01-2006, 19:25
Falsche Zahlenbasis für 156, du brauchst 0156

156 ist für den C Compiler eine Zahl im Dezimalsystem, also Basis 10
Die Werte für chmod oder umask sind aber aus dem Oktalsystem, also Basis 8

156 dezimal entspricht 234 oktal, daher 501 als Ergebnis

Für eine Compiler ist ein numerisches Literal
- hexadezimal wenn es mit 0x beginnt
- oktal wenn es mit 0 beginnt
- sonst dezimal

Ciao,
_

Danny4
14-01-2006, 21:35
Klingt plausibel, aber dann wäre ja die 022 eine 026 Oktal. Jetzt bin ich etwas verwirrt. Ich poste mal hier die entsprechende Prüfungsfrage:

Welche Rechte hat die Datei bsp.txt nach der Ausführung der Funktion: creat("bsp.txt", 0731);
wenn unmask den Wert
a: 022
b: 156
hat?

Danny4
14-01-2006, 21:52
Hmm, ich glaube jetzt habe ich's. Quelltext müsste so aussehen:


umask(0022);
int fd1 = creat("a.txt", 0731);

umask(0156);
int fd2 = creat("b.txt", 0731);

Ergibt für a.txt 711 und für b.txt 621, genau wie "schriftlich" ausgerechnet.

Vielen Dank für die schnelle Hilfe. :)

Joghurt
14-01-2006, 23:02
Nur zur Klarstellung: Die Operation ist nicht Minus, sondern And Not:

mod = 0777 & (~umask)

Danny4
14-01-2006, 23:14
Oh ja danke. Ist auch logisch so. Das mit dem Minus habe ich irgendwo aufgeschnappt ohne darüber nachzudenken.

Joghurt
15-01-2006, 15:42
Im Falle von 0777 stimmt es natürlich; wenn die Umask von 0744 abgezogen würde, würde allerdings u.U. das falsche herauskommen.