c हरण लिनक्स में उपयोग करने के लिए आपको एक टेम्पके फ़ाइल का नाम कैसे मिलता है?




लिनक्स के फायदे (5)

आपको 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);

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


@garethm:

मेरा मानना ​​है कि जिस कार्य के लिए आप खोज रहे हैं उसे टाम्पनाम कहा जाता है

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

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


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

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

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


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


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







linux