Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c

unix

file-io

I am trying to read some text from a file and write it to another using open(), read() and write().

This is my open() for the file-to-write-to (I want to create a new file and write into it):

fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC); 

This is setting file-permissions to something I don't understand at all. This is the output of ls -l:

---------T 1 chaitanya chaitanya 0 2010-02-11 09:38 test-1 

Even the read permission is locked. I tried searching for this, but could not find ANYTHING. Strangely, write() still successfully writes data to the file.

Also, if I do a 'chmod 777 test-1', things start working properly again.

Could someone please let me know where I am going wrong in my open call?

Thanks!

For your reference, I have pasted the complete program below:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>  int main () {      char buffer[512], ch;      int fIn, fOut, i;     ssize_t bytes;     FILE *fp = NULL;      //open a file     fIn = open ("test", O_RDONLY);     if (fIn == -1) {         printf("\nfailed to open file.");         return 1;     }      //read from file     bytes =  read (fIn, buffer, sizeof(buffer));     //and close it     close (fIn);      printf("\nSuccessfully read %d bytes.\n", bytes);      //Create a new file     fOut = open ("test-1", O_RDWR | O_CREAT | O_SYNC);      printf("\nThese are the permissions for test-1\n");     fflush(stdout);     system("ls -l test-1");      //write to it and close it.     write (fOut, buffer, bytes);     close (fOut);       //write is somehow locking even the read permission to the file. Change it.     system("chmod 777 test-1");      fp = fopen ("test-1", "r");     if (fp == NULL) {         printf("\nCan't open test-1");         return 1;     }      while (1)     {         ch = fgetc(fp);         if (ch == EOF)             break;         printf("\n%c", ch);     }      fclose (fp);      return 0; } 
like image 549
Chaitanya Avatar asked Feb 11 '10 14:02

Chaitanya


People also ask

What is the mode to create a file with all read and write permissions?

We can use the 'chmod' command which stands for 'change mode'. Using the command, we can set permissions (read, write, execute) on a file/directory for the owner, group and the world.

What are permissions 644?

Permissions of 644 mean that the owner of the file has read and write access, while the group members and other users on the system only have read access.

What are the three sets of permission for a file?

The Basics There are three basic permissions in each set: read, write, and execute. For files, those are pretty straightforward: "read" lets you see the file's contents; "write" lets you change the file's contents; and "execute" lets you run the file as a program.


1 Answers

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 world the 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 (---).

like image 78
Antti Huima Avatar answered Oct 18 '22 09:10

Antti Huima