2012-12-11 12 views
5

मुझे अपने सी प्रोग्राम में एक अस्थायी फ़ाइल बनाने की आवश्यकता है, इसके लिए कुछ डेटा लिखें, और उसके बाद मैंने बनाई गई फ़ाइल पर कुछ प्रोसेसिंग करने के लिए बाहरी कमांड (निष्पादन या सिस्टम के माध्यम से) का आह्वान करें। मैंने बाहरी कमांड नहीं लिखा और न ही यह मेरे प्रोग्राम में इसे एकीकृत करने के लिए व्यवहार्य है, इसलिए मुझे नहीं लगता कि मैं इसके साथ पहले से ही खुले डिस्क्रिप्टर को साझा कर सकता हूं। इसलिए, मुझे बनाई गई अस्थायी फ़ाइल का नाम जानना होगा।मैं एक अस्थायी फ़ाइल कैसे खोलूं और उसका फ़ाइल नाम कैसे प्राप्त करूं?

tempname() फ़ंक्शन यह करता है, लेकिन दुर्भाग्यवश यह अनुशंसा करता है कि आप नाम का उपयोग करने और फ़ाइल खोलने के बीच संभावित दौड़ की स्थिति के कारण स्वयं का उपयोग न करें, और न ही कार्यों के अनुशंसाओं में से कोई भी (tmpfile और mkstemp) बनाई गई फ़ाइल के वास्तविक नाम का पता लगाने का एक तरीका प्रदान करें।

+2

'mkstemp' नाम देता है; यह एक्स को वास्तविक मानों के साथ बदलकर पारित टेम्पलेट तर्क (जो एक char *, एक कॉन्स char * नहीं है) को संशोधित करेगा। – Joe

उत्तर

5

यह सच नहीं है mkstemp, संकलन और इस कार्यक्रम पर अमल खुद को देखने के लिए की कोशिश करते हैं नहीं है कि आप अस्थायी फ़ाइल नाम पता:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char fn[] = "/tmp/fileXXXXXX"; 
    int fd = mkstemp(fn); 
    char cmd[200]; 
    int n = snprintf(cmd, sizeof(cmd), "ls -l %s\n", fn); 

    printf("snprintf=>%d\n sizeof(fn)=%d\n", n, sizeof(fn)); // extra info, see comments 

    printf("%s\n", cmd); 
    return system(cmd); 
} 

mkstemp बफर आप पारित में फ़ाइल नाम टेम्पलेट का स्थान ले लेगा वास्तविक फ़ाइल नाम के साथ, आप बाद में इस बफर के साथ जो भी चाहें कर सकते हैं।

+0

आह, ठीक है आप हैं। यह सुनिश्चित नहीं है कि मैन पेज को पढ़ने से मुझे कैसे याद आया। धन्यवाद! – Michael

+0

यह देखते हुए कि यदि मैंने ऊपर की तरह एक स्ट्रिंग असाइन की है, तो मुझे __gen_tempname में segfault मिलता है। अगर मैं इसे strdup, तो मैं नहीं करता। यह मंच निर्भर हो सकता है, लेकिन मुझे लगता है कि कुछ मामलों में स्ट्रिंग स्थिरांक केवल पढ़ने-योग्य खंड में रखे जा रहे हैं। – Michael

+1

@ माइकल मुझे विश्वास है कि कोड ठीक है। ध्यान दें, कि मैंने 'char' के सूचक के रूप में 'fn' घोषित नहीं किया था। यह वास्तव में एक स्थानीय सरणी (यह ढेर पर है) स्ट्रिंग शाब्दिक डेटा के साथ शुरू किया गया है। – piokuc

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

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