2013-03-21 6 views
5

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

+0

फ़ाइल लिखने या पढ़ने का प्रयास करें। उसे एक त्रुटि वापस करनी चाहिए। – RedX

+2

@RedX यह नहीं है कि यूनिक्स कैसे काम करता है। – LtWorf

+0

हां, मुझे पता है कि मुझे उस फ़ाइल को पढ़ना या खोलना है, लेकिन क्या सिर्फ एफडी के साथ फाइल खोलने या पढ़ने का कोई तरीका है? क्या सिर्फ एफडी, कोई पथ या फ़ाइल * –

उत्तर

4

यूनिक्स सिस्टम आपको खुली फ़ाइलों को हटाने देता है (या, फाइल सिस्टम से फ़ाइल के सभी संदर्भ हटाएं)। लेकिन फाइल डिस्क्रिप्टर अभी भी मान्य है। कोई भी पढ़ना और लिखना कॉल सफल होगा, क्योंकि वे अभी भी फ़ाइल नाम के साथ होंगे।

दूसरे शब्दों में, फ़ाइल फ़ाइल डिस्क्रिप्टर बंद होने तक आप फ़ाइल को पूरी तरह से हटा नहीं सकते हैं। एक बार बंद हो जाने पर, फ़ाइल को स्वचालित रूप से हटा दिया जाएगा।

एक वैध फ़ाइल डिस्क्रिप्टर के साथ, आप जांच सकते हैं कि फ़ाइल नाम अभी भी मौजूद है या नहीं।

printf("%d\n", buf.st_nlink); // 0 means no filenames 

कहाँ buf एक struct statfstat साथ initialised है।

+0

सलाह के लिए धन्यवाद लेकिन यह एक अलग स्थिति है जिसका सामना कर रहा हूं। मुझे बस यह जांचने की ज़रूरत है कि फ़ाइल जो एफडी इंगित करती है या नहीं। यदि नहीं तो एफडी के माध्यम से सीखने का तरीका क्या है? –

+1

@ हसनबोजोक - आप हार्ड लिंक की संख्या प्राप्त करने के लिए वैध फ़ाइल डिस्क्रिप्टर पर 'fstat' का उपयोग कर सकते हैं। यदि यह 0 है, तो फ़ाइल नाम हटा दिया गया है। – teppic

+0

@teppic, क्या कोई तरीका है ['ioctl'] (http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html) वास्तव में फ़ाइल को हटाने के लिए उपयोग किया जा सकता है? यदि यह संभव था, तो क्या यह खतरनाक होगा? –

1

फाइल करने के लिए लिखने से पहले आप अगर यह अभी भी वहाँ access()

if (access("/yourfile",W_OK)!=-1) { 
    //Write on the file 
} 

तुम भी वर्णनकर्ता पर fstat कर सकते हैं उपयोग कर रहा है जांच कर सकता है:

struct stat statbuf; 
fstat(fd,&statbuf); 
if (statbuf.st_nlink > 0) { 
    //File still exists 
} 

लेकिन यह एक अपने सॉफ्टवेयर धीमी हो जाएगी बहुत कुछ, और कुछ प्रोग्राम फ़ाइल को कहीं और लिंक कर सकते हैं और मूल नाम को अनलिंक कर सकते हैं, ताकि फ़ाइल अभी भी मौजूद हो लेकिन एक अलग नाम/स्थान के तहत, और यह विधि इसका पता नहीं लगाएगी।

जीएनयू/लिनक्स पर inotify या बीएसडी पर क्यूक्यू का उपयोग करने के लिए एक बेहतर विकल्प होगा, लेकिन मैंने कभी दूसरा उपयोग नहीं किया है।

आप निर्देशिकाओं में परिवर्तन देखने और कर्नेल से सूचनाएं प्राप्त करने के लिए इन API का उपयोग कर सकते हैं और किसी अन्य प्रक्रिया द्वारा आपकी फ़ाइल को हटाए जाने पर एक ईवेंट प्राप्त कर सकते हैं, और इसके बारे में कुछ कर सकते हैं।

ध्यान रखें कि यह घटनाएं वास्तविक समय में नहीं हैं, इसलिए आप ईवेंट प्राप्त करने से पहले कुछ मिलीसेकंड के लिए फ़ाइल का उपयोग कर सकते हैं।

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