2009-02-27 8 views
10

का उपयोग करके मैं एक प्रोग्राम लिख रहा हूं जो फ़ाइल में आउटपुट लिखता है। अगर यह फ़ाइल मौजूद नहीं है, तो मैं इसे बनाना चाहता हूं।ओपन() सिस्टम कॉल

वर्तमान में, मैं खुले कॉल करते समय निम्नलिखित झंडे का उपयोग कर रहा हूं: O_WRONLY | O_CREATE

हालांकि, जब इस फ़ाइल बनाता है, यह मेरे किसी भी नियंत्रण दिया जाएगा नहीं इसे करने के लिए लिखने के लिए ...

मैं खुला का उपयोग कैसे कर सकते हैं इतना है कि यह एक फ़ाइल बनाता है अगर यह मौजूद नहीं है, लेकिन आवश्यकता होने पर आवश्यक अनुमतियों के साथ इसे बनाएंगे?

धन्यवाद!

उत्तर

17

आपको शायद तीसरे तर्क की आवश्यकता है। उदाहरण के लिए:

 
open('path',O_WRONLY|O_CREAT,0640); 
+0

यह बिल्कुल था! धन्यवाद! – samoz

+1

हार्ड कोडित परमिट के बजाय @ डेविड के ध्वज स्थिरांक (S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH) के उपयोग के लिए मुझे थोड़ा वरीयता है, लेकिन अन्यथा एक अच्छा जवाब है। –

+0

हां, उसका जवाब बेहतर है। मेरा तीसरा तर्क केवल एक त्वरित संकेतक है (मेरी स्ट्रिंग भी वैध नहीं है!)। –

1

लिनक्स पर एक तीसरा तर्क है जिसका उपयोग आप अनुमतियों को पारित करने के लिए कर सकते हैं। S_IWUSR आपको लिखने की अनुमति देने के लिए ध्वज होना चाहिए, लेकिन व्यावहारिक रूप से आप शायद उस से अधिक झंडे का उपयोग करना चाहेंगे (bitwise या एक साथ)। अनुमति झंडे की सूची के लिए मैनपेज की जांच करें।

1

manual से:

O_CREAT

फ़ाइल मौजूद है, तो इस ध्वज के रूप में नीचे O_EXCL के तहत उल्लिखित को छोड़कर कोई प्रभाव नहीं है। अन्यथा, फ़ाइल बनाई जाएगी; फ़ाइल की उपयोगकर्ता आईडी प्रक्रिया की प्रभावी उपयोगकर्ता आईडी पर सेट की जाएगी; फ़ाइल की समूह आईडी फ़ाइल की मूल निर्देशिका या प्रक्रिया की प्रभावी समूह आईडी की समूह आईडी पर सेट की जाएगी; और एक्सेस करने की अनुमति बिट्स ( देखें) फ़ाइल मोड के प्रकार mode_t के रूप में लिया तीसरे तर्क के मान पर सेट किया जाएगा संशोधित इस प्रकार है: एक बिटवाइज़ और फ़ाइल-मोड बिट्स पर और किया जाता है प्रक्रिया 'फ़ाइल मोड निर्माण मास्क प्रक्रिया के पूरक में संबंधित बिट्स। इस प्रकार, फ़ाइल मोड में सभी बिट्स फ़ाइल मोड निर्माण मास्क सेट में संबंधित बिट को साफ़ कर दिया गया है। जब फ़ाइल फ़ाइल बिट्स के अलावा अन्य बिट्स सेट हैं, तो प्रभाव निर्दिष्ट नहीं है। तीसरा तर्क को प्रभावित नहीं करता है कि फ़ाइल पढ़ने, लिखने या दोनों के लिए खुला है या नहीं। कार्यान्वयन को फ़ाइल की समूह आईडी को मूल निर्देशिका की समूह आईडी में प्रारंभ करने का तरीका प्रदान करेगा। कार्यान्वयन, लेकिन फ़ाइल की समूह आईडी को पर प्रक्रिया के प्रभावी समूह आईडी को प्रारंभ करने के लिए कार्यान्वयन-परिभाषित तरीके प्रदान करने की आवश्यकता नहीं है।

तो ऐसा लगता है कि आपको वांछित फ़ाइल अनुमतियों को निर्दिष्ट करने वाले तीसरे तर्क को पारित करने की आवश्यकता है।इसलिए इस तरह

int open(const char* pathname, int flags, mode_t mode); 

:

12

बस open के लिए वैकल्पिक तीसरा तर्क का उपयोग

open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH); 

man open(2) देखें।

+4

वह 'मैन 2 ओपन' होगा। – mgold

+1

यह 'S_IWUSER' नहीं है 'S_IWUSR' –

0

ध्यान दें कि POSIX (यूनिक्स, लिनक्स, मैकोज़, आदि) के तहत आप किसी भी अनुमति के साथ फ़ाइल खोल सकते हैं और बना सकते हैं, जिसमें 0 (किसी के लिए कोई अनुमति नहीं है), और फिर भी लिखने के लिए खोले गए फ़ाइल को अभी भी लिखना ।