2012-04-13 11 views
6

पर सी का उपयोग कर सही अनुमति के साथ निर्देशिका कैसे बनाएं I एक सरल सी प्रोग्राम लिखने की कोशिश कर रहा हूं जो निर्देशिका बनाता है (एक mkdir क्लोन।)।पॉज़िक्स

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

इस कोड d--------- साथ निर्देशिका बनाता है लेकिन मैं इसे drwxr-xr-x के साथ बनाने के लिए की तरह mkdir करना चाहते हैं: यह क्या मैं अब तक किया है? मुझसे यहां क्या गलत हो रहा है?

संपादित करें:

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

umask के अनुसार सही अनुमतियाँ सेट करने से नियंत्रित किया जाता है: यह मेरे लिए काम कर समाधान है। तो मुझे केवल पूर्ण अनुमतियों के साथ mkdir को कॉल करने की आवश्यकता है, और यह वर्तमान उमास्क के अनुसार कटा हुआ हो जाता है।

+0

डायग्नोस्टिक प्रिंट का उत्पादन क्या होता है? यदि आप '% i' के बाद एक नई लाइन जोड़ते हैं तो यह बेहतर काम कर सकता है, और यदि आप'% i' के बजाय '% o' या'% .4o' का उपयोग करते हैं तो यह अधिक आसानी से सुगम होगा। साथ ही, आपको # # शामिल 'दिखाई दे रहा है जो' 'umask()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) और ['mkdir()'] घोषित करता है (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html)। –

+0

यह% 4o के साथ 22 का उत्पादन करता है। – yasar

उत्तर

0

एरिक कहते हैं, umask वास्तविक अनुमति मोड में आप प्राप्त की पूरक है। तो मास्क को mkdir() पर पास करने के बजाय, आपको 0777-mask से mkdir() पर जाना चाहिए।

+0

धन्यवाद, मैं वास्तव में सही अनुमति प्राप्त करने के लिए उमास्क को शामिल करना चाहता था। मैंने 0777-मास्क बदलकर 0777 और ~ मास्क बदल दिया। :) – yasar

+0

मुझे वास्तव में उमास्क का उपयोग करने की ज़रूरत नहीं है, क्योंकि जाहिर है, mkdir पहले से ही ऐसा करता है। तो जब मेरा उमास्क 022 है तो 'drwxr-xr-x' वाली निर्देशिका में 0777 परिणाम का उपयोग करें – yasar

7

आपको लगता है कि umask का उपयोग गलतफहमी है। यह सेट/प्रक्रिया की फाइल मोड निर्माण मुखौटा, जो बारी में फ़ाइल मोड में बिट्स बंद बारी करने के लिए प्रयोग किया जाता है तो आप इस (pseduo-कोड) की तरह mkdir की तरह कॉल में निर्दिष्ट करते हैं, पुन: प्राप्त करता:

real_mode = requested_mode & ~umask 

तो में आपका कोड, चूंकि आप स्वयं को उमास्क के मान में पास करते हैं, तो आप अनुमतियों को शून्य के रूप में निर्दिष्ट करते हैं, जो वास्तव में आप देखते हैं।

इसके बजाय, आप, mkdir करने के लिए अनुमति कॉल में आप चाहते हैं निर्दिष्ट करना चाहिए इस तरह:

mkdir("trial", 0755) 
+3

मुझे लगता है कि yasar11732 वर्तमान उपयोगकर्ता की उमास्क सेटिंग को शामिल करना चाहता है, हार्ड कोडिंग '0755' नहीं। बस मेरा अनुमान है। –

+1

आमतौर पर किसी एप्लिकेशन में उपयोगकर्ता के उमास्क के साथ गड़बड़ करने की आवश्यकता नहीं होती है; libc पहले से ही आपके लिए 'mkdir() 'में करता है। तो हार्डकोडिंग 0755 या 0775 बिल्कुल ठीक है। –

+4

क्या होगा यदि मैं 'umask 0'? हार्डकोडिंग 0755 वांछित 0777 के बजाय इसे 0755 बना देगा। शायद 077 हार्डकोडिंग अधिक सही है, क्योंकि yasar11732 ने टिप्पणी की है, लेकिन यह '0777 और ~ मास्क 'के लिए हानिकारक नहीं है। –