2012-01-29 11 views
7

a creare un file utilizzando il codice qui sotto:aperti i permessi dei file() non correttamente l'impostazione

#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; 
} 

ho specificare l'argomento mode come 0666, che dovrebbe concedere leggere, scrivere l'accesso a tutti. Tuttavia, un ls -l mostra

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

Come si può vedere, scrivere autorizzazioni vengono concesse solo per il proprietario del file. Non so perché a tutti gli altri non sono concesse le autorizzazioni correttamente. chmod a+w test.out imposta le autorizzazioni correttamente però.

codice compilato come gcc -Wall test.c

Spec: gcc v 4.5.0 in openSUSE 11.3 a 64 bit

+3

controllare umask. controlla umask. – wildplasser

+0

Hai provato a utilizzare le costanti per i flag, ad es. S_IRUSR, S_IRGRP, ecc.? – dasblinkenlight

+0

@dasblinkenlight L'uso delle costanti non ha aiutato. Era un problema di umask, usando fchmod dopo l'apertura del file ora come mostrato nella risposta – jitihsk

risposta

15

La mode argomento per open specifica i massimo permessi consentiti. L'impostazione umask viene quindi applicata per limitare ulteriormente le autorizzazioni.

Se è necessario rendere le autorizzazioni specifiche per 0666, sarà necessario utilizzare fchmod sull'handle del file dopo che l'apertura ha avuto esito positivo.

+2

+1 Due anni dopo e mi imbatto in questa risposta mentre faccio i compiti di CS. Non sapevo che avrei dovuto 'fchmod' per impostare esplicitamente i permessi a' 0666' – yiwei

3

L'esecuzione di questo codice:

#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; 
} 

sulla mia macchina Linux, dove umask rendimenti 0022, mi dà un file con i seguenti attributi:

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

Quindi, come si può vedere, la umask maschera i bit di scrittura nel mio caso. Sembra che sia lo stesso anche sul tuo sistema.

Problemi correlati