Sie müssen die drei Argument Form open()
wenn Sie O_CREAT angeben. Wenn Sie das dritte Argument weglassen, verwendet open()
den Wert, der zufällig auf dem Stapel liegt, auf dem das dritte Argument erwartet wurde. Dies ist selten eine kohärente Menge von Berechtigungen (in Ihrem Beispiel scheint es, dass Dezimal 12 = Oktal 014 war auf dem Stapel). Das dritte Argument sind die Berechtigungen für die Datei, die durch den Wert umask()
geändert werden.
int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);
Beachten Sie, dass Sie eine Datei ohne Schreibberechtigungen erstellen können (an anderen Personen oder ein anderes Verfahren), während noch in der Lage zu sein, um es von dem aktuellen Prozess zu schreiben. Es ist selten notwendig, Ausführungsbits für Dateien zu verwenden, die aus einem Programm erstellt wurden - es sei denn, Sie schreiben einen Compiler (und '.svg' Dateien sind normalerweise keine ausführbaren Dateien!).
Die S_xxxx Fahnen kommen aus <sys/stat.h>
und <fcntl.h>
- Sie entweder Header, um die Informationen zu erhalten, verwenden können (aber open()
selbst in <fcntl.h>
erklärt wird).
Beachten Sie, dass der feste Dateiname und das Fehlen von Schutzoptionen wie O_EXCL
sogar die überarbeitete open()
Aufruf etwas unsicher machen.
Super Beispiel für unsafe Code. –
@Michael Fouarakis: vorübergehend gibt es größere Probleme zu bewältigen, aber Sie haben Recht. O_EXCL sollte hinzugefügt werden (um zu verhindern, dass böswillige gebrochene symbolische Links verloren gehen, und um zu verhindern, dass andere Leute die Datei überlisten, wenn sie das gleiche Programm auf demselben Rechner ausführen); Der feste Name wird im Produktionscode problematisch sein, also sollte er '' mkstemp() ''oder einen Verwandten verwenden, um den Dateinamen zu erzeugen. Und die Liste geht ohne Zweifel weiter. –