Posix

2012-04-13 24 views
6

üzerinde C kullanarak doğru permissons ile dizin oluşturma Nasıl dizinler (bir mkdir clone.) Oluşturan basit bir C programı yazmaya çalışıyorum.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; 
} 

Bu kod d--------- ile dizin oluşturur ama mkdir yapmak gibi drwxr-xr-x ile oluşturmak istiyorum: Bu defa ne var? Burada neyi yanlış yapıyorum?

Düzenleme

: Umask göre doğru izinleri ayarlama

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

otomatik olarak işlendiğinden: Bu benim için çalışma çözümdür. Bu yüzden sadece mkdir'i tam izinlerle çağırmam gerekiyordu ve bu da mevcut umask'a göre kesiliyor.

+0

Tanılama baskısı ne üretir? "% I" den sonra bir satır eklediyseniz daha iyi olabilir ve "% o" veya "% i" yerine "% .4o" ifadesini kullandıysanız daha kolay okunabilir. Ayrıca, [# umask() '] 'ı (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) ve [' mkdir() '] bildiren #include ' eksik gibi görünüyorsunuz (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html). –

+0

% 22 ile% 4o üretir. – yasar

cevap

0

Eric söylediği gibi olsun fiili izin modunun tamamlayıcısı Umask olduğunu. Yani, maskeyi mkdir()'a geçirmek yerine, 0777-mask'u mkdir()'a geçirmelisiniz.

+0

Teşekkürler, ben gerçekten doğru izni almak için umask birleştirmek istedim. Yine de 0777 maskesini 0777'ye değiştirdim. :) – yasar

+0

Aslında umask'i doğrudan kullanmam gerekiyor, çünkü görünüşe göre, mkdir zaten bunu yapıyor. 0777 kullanarak umask 022 iken drwxr-xr-x' ile bir dizinde sonuçlanır – yasar

7

umask'un ne için yanlış anlaşıldığını düşünüyorsunuz. Yani içinde

real_mode = requested_mode & ~umask 

: Bu/sırayla dosya modunda bit kapalı dönüş için kullanılan sürecin dosya modu oluşturma maskesi, şöyle bu (pseduo-kodu), mkdir gibi çağrılarda belirtmek alır setleri Kodunuz, umask'ın değerini geçtiğinizden, izinleri sıfır olarak belirtin, tam olarak gördüğünüz gibi.

Bunun yerine, bu gibi mkdir çağrısında istediğiniz izinleri belirtmelidir:

mkdir("trial", 0755) 
+3

Ben yasar11732 mevcut kullanıcının umask ayarını dahil etmek istediğini düşünüyorum, '0755' kodlaması zor değil. Sadece benim tahminim. –

+1

Normalde, kullanıcının uygulamadaki umaskını karıştırmaya gerek yoktur; libc zaten sizin için 'mkdir()' de bunu yapar. Yani 0755 veya 0775 kodlaması gayet iyi. –

+4

Ya ben 0 umasaydım? 0755 kodlaması 0755 yerine 0755 yapacaktır. Belki 0777 kodlaması daha doğrudur, çünkü yasar11732 yorumlanmıştır, ancak 0777 & ~ maske için zararlı değildir. –