2012-04-13 31 views
6

Tôi đang cố gắng viết một chương trình C đơn giản tạo thư mục (bản sao mkdir.). Đây là những gì tôi có cho đến nay:Làm thế nào để tạo thư mục với các quyền bằng cách sử dụng C trên Posix

#include <stdlib.h> 
#include <sys/stat.h> // mkdir 
#include <stdio.h> // perror 

mode_t getumask() 
{ 
    mode_t mask = umask(0); 
    umask (mask); 
    return mask; 
} 

int main(int argc, const char *argv[]) 
{ 
    mode_t mask = getumask(); 
    printf("%i",mask); 

    if (mkdir("trial",mask) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

Mã này tạo thư mục với d--------- nhưng tôi muốn nó tạo ra nó với drwxr-xr-x như mkdir làm gì? Tôi làm gì sai ở đây?

Edit: Đây là giải pháp làm việc cho tôi:

int main(int argc, const char *argv[]) 
{ 
    if (mkdir("trial",0777) == -1) { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    return 0; 
} 

quyền hạn Thiết lập theo umask được tự động xử lý. Vì vậy, tôi chỉ cần gọi mkdir với đầy đủ các quyền và bị cắt nhỏ theo umask hiện tại.

+0

In chẩn đoán tạo ra những gì? Nó có thể làm việc tốt hơn nếu bạn thêm một dòng mới sau '% i', và nó sẽ dễ đọc hơn nếu bạn sử dụng'% o' hoặc '% .4o' thay vì'% i'. Ngoài ra, bạn dường như bị thiếu '#include ' khai báo ['umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) và ['mkdir()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

Nó tạo ra 22 với% 4o. – yasar

Trả lời

0

Như Eric nói, umask là phần bù của các chế độ cho phép thực tế bạn nhận được. Vì vậy, thay vì tự chuyển mặt nạ tới mkdir(), bạn nên vượt qua 0777-mask đến mkdir().

+0

Cảm ơn, tôi thực sự muốn kết hợp umask để có được sự cho phép chính xác. Tôi đã thay đổi 0777-mask thành 0777 & ~ mask. :) – yasar

+0

Tôi thực sự không cần sử dụng umask trực tiếp, kể từ khi appearantly, mkdir đã làm điều đó. Vì vậy, sử dụng 0777 kết quả trong một thư mục với 'drwxr-xr-x' khi umask của tôi là 022 – yasar

7

Dường như bạn hiểu nhầm umask được sử dụng cho mục đích gì. Nó đặt/lấy mặt nạ của quá trình tạo chế độ tập tin, do đó được sử dụng để tắt bit ở chế độ tập tin bạn chỉ định trong các cuộc gọi như mkdir, như thế này (pseduo-code):

real_mode = requested_mode & ~umask 

Vì vậy, trong mã của bạn, kể từ khi bạn vượt qua trong giá trị của umask chính nó, bạn kết thúc chỉ định quyền là số không, đó là chính xác những gì bạn nhìn thấy.

Thay vào đó, bạn nên xác định các điều khoản mà bạn muốn trong cuộc gọi đến mkdir, như thế này:

mkdir("trial", 0755) 
+3

Tôi nghĩ rằng yasar11732 muốn kết hợp cài đặt umask của người dùng hiện tại, không phải mã hóa cứng '0755'. Chỉ cần đoán của tôi. –

+1

Thường không cần phải gây rối với umask của người dùng trong một ứng dụng; libc đã làm điều đó cho bạn trong 'mkdir()'. Vì vậy, hardcoding 0755 hoặc 0775 là hoàn toàn tốt đẹp. –

+4

Nếu tôi 'umask 0' thì sao? Hardcoding 0755 sẽ làm cho nó 0755 thay vì mong muốn 0777. Có lẽ hardcoding 0777 là chính xác hơn, như yasar11732 nhận xét, nhưng nó không có hại cho '0777 & ~ mask'. –

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