2012-01-29 15 views
7

utworzyć plik za pomocą poniższego kodu:otwarte uprawnienia do pliku() nie ustawienie prawidłowo

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main() 
{ 
    const char* filename = "./test.out"; 
    int fd; 
    if(-1 == (fd = open(filename, O_CREAT|O_RDWR, 0666))) 
    { 
     perror("Error"); 
     errno = 0; 
    }  
    else 
     puts("File opened"); 

    if(-1 == (close(fd))) 
    { 
     perror("Error"); 
     errno = 0; 
    } 
    else 
     puts("File closed"); 

    return 0; 
} 

mogę określić mode argumentu jako 0666, która powinna przyznawać prawa odczytu, zapisu dostępu do wszystkich. Jednak ls -l pokazuje

-rw-r--r-- 1 kmehta users 0 2012-01-29 16:29 test.out

Jak widać, pisać uprawnienia są przyznawane tylko dla właściciela pliku. Nie wiem, dlaczego wszyscy inni nie mają praw poprawnie. chmod a+w test.out ustawia jednak poprawnie uprawnienia.

kod zestawione jako gcc -Wall test.c

Specyfikacja: gcc v 4.5.0 na openSuSe 11,3 64 bitów

+3

sprawdzić umask. sprawdź umask. – wildplasser

+0

Czy próbowałeś używać stałych dla flag, np. S_IRUSR, S_IRGRP itd.? – dasblinkenlight

+0

@ dasblinkenlight Używanie stałych nie pomogło. To był problem z umaską, przy użyciu fchmod po pliku teraz otwórz, jak pokazano w odpowiedzi – jitihsk

Odpowiedz

15

mode argument open określa maksymalne zezwolenie do wolnego miejsca. Ustawienie umask jest następnie stosowane w celu dalszego ograniczenia uprawnień.

Jeśli potrzebujesz uprawnień 0666, musisz użyć fchmod na uchwycie pliku, gdy proces się powiedzie.

+2

+1 Dwa lata później i natknę się na tę odpowiedź podczas wykonywania pracy domowej CS. Nie wiedziałem, że będę musiał "fchmod", aby jawnie ustawić uprawnienia do '0666' – yiwei

3

Wykonanie tego kodu:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

int main(void) 
{ 
     int fd; 
     if((fd = open("new.file",O_CREAT,S_IRWXU | S_IRWXG | S_IRWXO)) == -1) 
     { 
       perror("open"); 
       return 1; 
     } 
     close(fd); 
     return 0; 
} 

na moim Linuksie, gdzie umask powraca 0022, daje mi plik z następujących cech:

-rwxr-xr-x 1 daniel daniel 0 Jan 29 23:46 new.file

Więc, jak widać, umask maskuje bity zapisu w moim przypadku. Wygląda na to, że jest taki sam w twoim systemie.

Powiązane problemy