[lpic] umask II

Cyrill Steiner cyrill.steiner at bluewin.ch
Fr Nov 21 23:18:54 CET 2014


Salut Niklaus

Merci für die ausführliche Antwort, noch ausfühlicher hätte sie nicht 
ausfallen können.

>> 1) Weiss jemand ob der Standardmodus von 0666 für Dateien und 0777 für
>> Verzeichnisse irgendwo konfiguriert werden kann oder ist das hart
>> codiert ?
> Den kannst du allerdings konfigurieren. Und zwar mit dem Kommando
> "umask" (siehe manpage). Wenn du das in /etc/profile schreibst, sollte
> es so ziemlich ueberall gelten, da neue Prozesse die umask von ihrem
> parent Prozess erben. Siehe auch:
Wie von René angemerkt, meinte ich eigentlich den Standardmodus, der 
angewendet würde wenn die umask 0000 wäre, resp. auf den die umask 
angewendet wird. Hätte ja sein können, das man das irgendwo 
konfigurieren könnte (in umask manpage beschrieben als " S_IRUSR | 
S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH  mode argument to open()")
> http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html
Auch in obigem Beitrag wird das subtrahieren der Oktalwerte beschrieben. 
Schade dass diese eigentlich falsche Operation so hartnäckig herumgeistert.
>> 2) Im englischen Wikipedia-Artikel zu umask steht, dass jeder Prozess
>> seine eigene umask besitzt, weiss jemand wo diese bei anderen
>> Prozessen als der shell
>> definiert wird ?
> Es gibt den Systemcall "umask()". Siehe dazu "man 2 umask". In einem C
> Programm kannst du diesen Systemcall aufrufen und ihm die gewuenschte
> umask uebergeben. Jeder Prozess hat seine eigene umask, die er bei
> seiner Entstehung von seinem parent Prozess erbt.
>
>
> Siehe dazu die Linux Kernel Sourcen:
>
> include/linux/sched.h definiert das Struct "task_struct". Diese Struktur
> wird intern im Kernel verwendet um Prozesse abzubilden und enthaelt alle
> Informationen zum Prozess (ein task_struct pro Prozess).
>
> So um die Zeile 1400 rum enthaelt dieses Struct einen Pointer auf ein
> weiteres Struct, diesmal vom Typ "fs_struct". Das fs_struct ist
> definiert in "include/linux/fs_struct.h". In diesem Struct sind
> Dateisystem-spezifische Informationen zum Prozess abgelegt.
>
> Fassen wir also zusammen:
>
> Jeder Prozess wird durch ein "task_struct" repraesentiert. Jedes task
> struct verweist auf ein ("hat ein") fs_struct und darin wiederum ist die
> umask des Prozesses gespeichert.
>
> Den Code zum "umask()" Systemcall findest du in "kernel/sys.c" (so um
> die Zeile 1600 rum). Es ist dieser Sytemcall der verwendet wird um die
> umask des Prozesses zu aendern. Hier der Code:
>
> SYSCALL_DEFINE1(umask, int, mask)
> {
>          mask = xchg(&current->fs->umask, mask & S_IRWXUGO);
>          return mask;
> }
>
> current ist das "task_struct" des aktuellen Prozesses.
> "&current->fs->umask" ist folglich die umask des aktuellen Prozesses.
> Die neue Maske (in der Variable "mask") wird bitweise addiert mit
> S_IRWXUGO. S_IRWXUGO ist hard kodiert auf 0777. Die bitweise Addition
> hat also keinen Einfluss (ausser dass das most significant byte immer 0
> ist).
Verstehe ich nicht wieso die neue Maske nicht einfach eingelesen wird, 
die bitweise Addition mit 777 verändert die Maske ja gar nicht, ist also 
eine sinnlose Operation und wenn man sicher sein will, dass das most 
significant byte 0 bleibt, könnte man das ja einfach  auf 0 setzen resp. 
gar nicht mitgeben/einlesen.
> Die beiden Werte (die neue umask und die alte umask) werden
> mittels xchg vertauscht (die Variable mask enthaelt jetzt den 'alten'
> Wert der umask des Prozesses). Zu guterletzt wird die alte, jetzt nicht
> mehr gueltige, umask des Prozesses an den Aufrufer zurueckgegeben.
>
> Ich hoffe das hat deine Frage beantwortet.
Ja das hat meine Frage beantwortet.


Gruss

Cyrill



Mehr Informationen über die Mailingliste lpic