I am trying to create a write only file in C on Linux (Ubuntu).
This is my code:
int fd2 = open ("/tmp/test.svg", O_RDWR|O_CREAT);
if (fd2 != -1) {
//....
}
But why do the files I created have ‘xr’ mode? How can I create it so that I can open it myself at command prompt?
------xr-- 1 michael michael 55788 2010-03-06 21:57 test.txt*
------xr-- 1 michael michael 9703 2010-03-06 22:41 test.svg*
You need the three-argument form of
open()when you specify O_CREAT. When you omit the third argument,open()uses whatever value happens to be on the stack where the third argument was expected; this is seldom a coherent set of permissions (in your example, it appears that decimal 12 = octal 014 was on the stack).The third argument is the permissions on the file – which will be modified by the
umask()value.Note that you can create a file without write permissions (to anyone else, or any other process) while still being able to write to it from the current process. There is seldom a need to use execute bits on files created from a program – unless you are writing a compiler (and ‘.svg’ files are not normally executables!).
The S_xxxx flags come from
<sys/stat.h>and<fcntl.h>— you can use either header to get the information (butopen()itself is declared in<fcntl.h>).Note that the fixed file name and the absence of protective options such as
O_EXCLmake even the revisedopen()call somewhat unsafe.