2011-01-09 14 views
8

पर पढ़ने/लिखने की अनुमतियां बदलें मैं एक लिनक्स सी प्रोजेक्ट पर काम कर रहा हूं और मुझे फ़ाइल डिस्क्रिप्टर के साथ काम करने में परेशानी हो रही है।फ़ाइल डिस्क्रिप्टर

मेरे पास एक अनाथ फ़ाइल डिस्क्रिप्टर है (फ़ाइल खुली थी() 'डी फिर अनलिंक()' डी लेकिन एफडी अभी भी अच्छी है) जिसमें केवल-पढ़ने की अनुमति है। मूल बैकिंग फ़ाइल में पूर्ण अनुमतियां थीं (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH के साथ बनाई गई), लेकिन हां फ़ाइल O_WRONLY के साथ खोली गई थी। क्या फ़ाइल डिस्क्रिप्टर को डुप्लिकेट करना और प्रतिलिपि O_RDWR में बदलना संभव है?

psudo-कोड:


//open orphan file 
int fd = open(fname, O_WRONLY, ...) 
unlink(fname) 
//fd is still good, but I can't read from it 

//... 

//I want to be able to read from orphan file 
int fd2 = dup(fd) 
//----change fd2 to read/write???---- 

अग्रिम धन्यवाद! -Andrew

+4

'fcntl (एफडी, एफ_एसईटीएफएल, एफसीएनटीएल (एफडी, एफ_जीईटीएफएल) | ओ_आरडीडब्लूआर)) * * लगता है * जैसे यह बात होगी, मैन पेज को छोड़कर विशेष रूप से यह कहता है कि काम नहीं करेगा। मुझे लगता है कि कुछ कारणों से कर्नेल को "असंभव" की आवश्यकता है? – aschepler

+2

तो यदि आप इसे पढ़ने की योजना बना रहे हैं तो आप इसे क्यूरोली मोड में क्यों खोलते हैं? –

+0

या सही झंडे का उपयोग करके इसे फिर से खोलें। – jweyrich

उत्तर

6

नहीं, खुले मोड को बदलने के लिए कोई POSIX फ़ंक्शन नहीं है। आपको इसे पढ़ने/लिखने के तरीके में खोलने की आवश्यकता होगी। चूंकि आपको एक अस्थायी फ़ाइल बनाई गई है, हालांकि, मैं दृढ़ता से अनुशंसा करता हूं कि आप mkstemp का उपयोग करें। यह फ़ंक्शन फ़ाइल को पढ़ने/लिखने के तरीके में ठीक से खोलता है और इसे अनलिंक करता है। सबसे महत्वपूर्ण बात यह है कि यह नामकरण और फ़ाइल बनाने में दौड़ की स्थिति से बचाता है, जिससे अस्थायी फ़ाइलों के निर्माण में भेद्यता से परहेज किया जाता है।

+2

mkstemp AFAIK को अनलिंक नहीं करता है? –

+0

एमके ने क्या कहा। मैं हमेशा खोलने के लिए O_EXCL जोड़ सकता हूं() और विफल होने पर पुनः प्रयास कर सकता हूं –

संबंधित मुद्दे