2008-08-27 11 views
9

मान लें कि मैं सी में एक प्रोग्राम बना रहा हूं जिसे एक टेम्पफाइल का उपयोग करने की आवश्यकता है।/Tmp में विज्ञापन tempfile बनाना संभवतः एक अच्छा विचार नहीं है। क्या मुझे टेम्पफाइल नाम के साथ आपूर्ति करने के लिए कोई फ़ंक्शन या ओएस कॉल है ताकि मैं इसे लिखना और पढ़ना शुरू कर सकूं?लिनक्स में उपयोग करने के लिए आपको टेम्पफाइल का फ़ाइल नाम कैसे मिलता है?

उत्तर

20

आप इस उद्देश्य के लिए mkstemp(3) फ़ंक्शन का उपयोग कर सकते हैं। एक और विकल्प tmpfile(3) समारोह है। उनमें से कौन सा आप चुनते हैं इस पर निर्भर करता है कि क्या आप फ़ाइल को सी लाइब्रेरी फ़ाइल स्ट्रीम (जो tmpfile करता है) के रूप में खोला जाना चाहते हैं, या एक प्रत्यक्ष फ़ाइल डिस्क्रिप्टर (mkstemp)। जब आप प्रोग्राम समाप्त करते हैं तो tmpfile फ़ंक्शन स्वचालित रूप से फ़ाइल को हटा देता है।

इन कार्यों का उपयोग करने का लाभ यह है कि वे अद्वितीय फ़ाइल नाम निर्धारित करने और फ़ाइल बनाने के बीच दौड़ की स्थिति से बचते हैं - ताकि दो प्रोग्राम एक ही समय में एक ही फाइल बनाने की कोशिश नहीं करेंगे।

अधिक जानकारी के लिए दोनों कार्यों के लिए मैन पेज देखें।

+0

mkstemp सिर्फ एक फ़ाइल वर्णनकर्ता एक पर खुला रिटर्न नई फाइल लेकिन आप इसे अंतिम नाम भी प्राप्त कर सकते हैं क्योंकि mkstemp टेम्पलेट के XXXXXX वर्णों को प्रतिस्थापित करता है। – Angel

2

बिल्कुल: मैन mkstemp।

मैन पेज का उदाहरण उपयोग है।

1

सी lib में कुछ भी के बारे में निश्चित नहीं है, लेकिन आप इसे mktemp के साथ खोल में कर सकते हैं।

3

@garethm:

मुझे विश्वास है कि समारोह आप देख रहे हैं tmpnam कहा जाता है।

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

tmpnam मैन पेज विशेष रूप से इसका उपयोग नहीं करने के लिए कहता है, लेकिन इसके बजाय mkstemp या tmpfile का उपयोग करने के लिए।

5

प्रश्न यह है कि एक अस्थायी फ़ाइल नाम कैसे उत्पन्न करें। न तो mkstemp और न ही tmpfile कॉलर को नाम के साथ प्रदान करते हैं, वे क्रमशः फ़ाइल डिस्क्रिप्टर या फ़ाइल हैंडल लौटाते हैं।

+0

आप सही हैं, मार्क, सवाल एक अस्थायी फ़ाइल नाम के लिए पूछता है। लेकिन सवाल गलत है। प्रश्नकर्ता वास्तव में एक अस्थायी फ़ाइल नाम नहीं चाहता है, वह वास्तव में एक अस्थायी फ़ाइल चाहता है। –

+1

फिर प्रश्न बदलना चाहिए। –

+10

सत्य नहीं है: mkstemp * करता है * कॉलर को एक नाम के साथ प्रदान करता है, क्योंकि यह दिए गए टेम्पलेट को संशोधित करता है। कॉलर को एक टेम्पलेट प्रदान करने की आवश्यकता है, लेकिन यह एक अस्थायी निर्देशिका (जैसे $ TMPDIR, P_tmpdir, या "/ tmp") और एक उपसर्ग चुनने का एक अपेक्षाकृत सरल मामला है, इसके बाद छह एक्स है। –

0

के रूप में इस सिफारिश समारोह है आप mkstemp() का उपयोग करना चाहिए, लेकिन यह एक फ़ाइल वर्णनकर्ता देता है, तो एक बार आप वर्णनकर्ता है यह नाम है मिलती है:

int fd; 
fd = mkstemp("hdrXXXXXX); 
/* Read out the link to our file descriptor. */ 
sprintf(path, "/proc/self/fd/%d", fd); 
memset(result, 0, sizeof(result)); 
readlink(path, result, sizeof(result)-1); 

/* Print the result. */ 
printf("%s\n", result); 
+0

कृपया यह [URL] chekc (http://stackoverflow.com/help) यह आपकी सामग्री की गुणवत्ता को बढ़ाने के लिए उपयोगी होगा –

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

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