Why does open() create my file with the wrong permissions? Why does open() create my file with the wrong permissions? c c

Why does open() create my file with the wrong permissions?


open() takes a third argument which is the set of permissions, i.e.

open(filename, O_RDWR|O_CREAT, 0666)

0666 is an octal number, i.e. every one of the 6's corresponds to three permission bits

6 = rw

7 = rwx

first three bits for owner permission, next three bits for group permission and next is for the worldthe first digit - represents that is file or directory. (0 - file, d - directory)here we used 0 means file

It's a typical pitfall. The compiler allows you to leave the permission argument away because when you open an existing file the permission bits don't make sense. But when you forget the argument when you create a file, you get a random set of permissions, e.g. 0000 in your case (---).


Reading http://linux.die.net/man/2/open it seems you missed the mode parameter for open:

mode must be specified when O_CREAT is in the flags, and is ignored otherwise. The argument mode specifies the permissions to use in case a new file is created.


This question recently helped me out, so I wanted to do my part to add a bit more depth as to what's going on. Like it was stated before, you were missing the third argument to open(). However, the permissions you see aren't random; they're coming from the stack. Look at the following code snippet:

    asm("push $0");    asm("push $0");    asm("push $0");    fd = open("base", O_RDWR|O_CREAT);

Note the following result:

    ----------. 1 user user 4 Feb 26 08:21 base

Let's change the first push to 1, i.e. execute permission:

    asm("push $1;push $0;push $0");    fd = open("base", O_RDWR|O_CREAT);

and we get:

    ---------x. 1 user user 4 Feb 26 08:25 base

Change the push to 4, i.e. read permission, and mess with the other two values:

    asm("push $4;push $5;push $6");    fd = open("base", O_RDWR|O_CREAT);

and we get:

    -------r--. 1 user user 4 Feb 26 08:27 base

Thus we can see the third value popped off the stack (first pushed) is what really matters. Finally for fun we can try 5 and then 50, which respectively result in:

    -------r-x. 1 user user 4 Feb 26 08:27 base    ----rw----. 1 user user 4 Feb 26 08:28 base

Hope this adds some clarity!