2012-01-29 19 views
7

tôi có thể tạo một tập tin bằng cách sử dụng mã bên dưới:open() không thiết lập quyền tập tin một cách chính xác

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

tôi chỉ định đối số mode như 0666, cần nguồn vốn hỗ trợ đọc, viết truy cập vào tất cả mọi người. Tuy nhiên, một ls -l lãm

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

Như bạn thấy, hãy viết điều khoản chỉ được cấp cho chủ sở hữu của tập tin. Tôi không biết tại sao mọi người khác không được cấp quyền chính xác. chmod a+w test.out đặt quyền một cách chính xác.

Mã biên soạn như gcc -Wall test.c

Specs: gcc v 4.5.0 trên OpenSUSE 11.3 64 bit

+3

kiểm tra umask. kiểm tra umask. – wildplasser

+0

Bạn đã thử sử dụng hằng số cho cờ, ví dụ: S_IRUSR, S_IRGRP, v.v.? – dasblinkenlight

+0

@dasblinkenlight Sử dụng hằng số không giúp được gì. Đó là một vấn đề umask, sử dụng fchmod sau khi tập tin mở bây giờ như được hiển thị trong câu trả lời – jitihsk

Trả lời

15

Các mode lập luận để xác định opentối đa quyền cho phép. Cài đặt umask sau đó được áp dụng để hạn chế thêm quyền.

Nếu bạn cần thực hiện các quyền là 0666, cụ thể bạn sẽ cần phải sử dụng fchmod trên xử lý tệp sau khi mở thành công.

+2

+1 Hai năm sau và tôi vấp ngã khi câu trả lời này trong khi làm bài tập về nhà CS. Tôi không biết rằng tôi sẽ phải 'fchmod' để thiết lập rõ ràng các điều khoản cho '0666' – yiwei

3

Thực thi mã này:

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

trên hộp Linux của tôi, nơi umask lợi nhuận 0022, mang lại cho tôi một tập tin với các thuộc tính sau:

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

Vì vậy, như bạn có thể thấy, mặt nạ umask ra các bit ghi trong trường hợp của tôi. Có vẻ như nó cũng giống nhau trên hệ thống của bạn.

Các vấn đề liên quan