2009-06-26 11 views
9

मुझे पता है कि सी ++ में is_open() फ़ंक्शन है, लेकिन मैं एक प्रोग्राम चाहता हूं कि कोई अन्य एप्लिकेशन द्वारा फ़ाइल खोला नहीं गया हो। मानक पुस्तकालय का उपयोग कर ऐसा करने का कोई तरीका है?सी ++ में किसी अन्य एप्लिकेशन द्वारा फ़ाइल को खोला गया है या नहीं?

संपादित करें - जवाब है कि यह एक लिनक्स आवेदन के लिए है में स्पष्ट किया।

उत्तर

4

नहीं, मानक पुस्तकालय में ऐसी कोई कार्यक्षमता नहीं है।

0

गैर देशी रूप है, तो आप Sysinternals' handle.exe एक अंतिम उपाय के रूप में करने के लिए बाहर कह सकते हैं ...

+0

+1 मैं एक ऐप ढूंढ रहा हूं जो वास्तव में handle.exe करता है। धन्यवाद ज़ोंबीशिप। – Kei

1

शायद आप बस कोशिश करते हैं और एक पूर्ण लिखने ताला मिल सकती है? अगर किसी और को पढ़ने या लिखने के लिए यह खुला है तो यह असफल हो जाएगा।

fopen("myfile.txt", "r+") 

अगर यह पार मंच नहीं है और है Win32, तो आप और भी अधिक सुक्ष्म ताले के सेट अनुरोध कर सकते हैं।

here देखें और dwShareMode, 0 का मान, साथ ही साथ अन्य पैरामीटर देखें।

+0

पूरी तरह से ऑपरेटिंग सिस्टम निर्भर। –

0

जैसा कि @ नील बटरवर्थ कहते हैं, मानक पुस्तकालय नहीं है।

यूनिक्स में आप फ़ाइल ताले उपयोग करने के लिए fcntl उपयोग कर सकते हैं।

आप कोई और नहीं द्वारा अपने खुले समारोह के लिए एक आवरण अपनी खुली अगर एक फ़ाइल लिख सकता है, कि एक ताला के लिए चेक (और ताले कोई भी मौजूद नहीं है)। आप करीब के लिए एक रैपर लिखते हैं, जो फ़ाइल को बंद करने पर लॉक करता है।

+0

लॉकिंग पूरी तरह से सलाहकार है, इसलिए यह केवल आपको बताती है कि किसी और ने फ़ाइल को झुका दिया है। – ephemient

0

विंडोज इस छोटे में और गंदा चाल काम करेंगे (यदि फ़ाइल मौजूद है और आप सही अनुमतियाँ)

if ( 0 != rename("c:/foo.txt", "c:/foo.txt") ) { 
    printf("already opened\n"); 
    } 

यह लिनक्स में भी काम करने के लिए संभावना है।

+0

यह वास्तव में गंदा है :-) – Totonga

+0

:) –

+0

मैं आसानी से भविष्य में एक ओएस को "फिक्स" जोड़ने की कल्पना कर सकता हूं जिसने इस चाल को तोड़ दिया। – Brian

3

न केवल मानक पुस्तकालय यह सामान्य रूप में संभव भी नहीं है इस funcionality नहीं है,। आप (लिनक्स पर) /proc/*/fd — देख सकते हैं लेकिन यह संभव है कि आपके प्रोग्राम को अन्य उपयोगकर्ताओं की प्रक्रियाओं पर ऐसा करने की अनुमति न हो (उदाहरण के लिए उबंटू में यह डिफ़ॉल्ट है)।

2

आप अन्य प्रक्रिया (स्रोत कोड है) को नियंत्रित करते हैं, तो सबसे अच्छा योजना दोनों प्रक्रियाओं में सलाहकार ताले उपयोग करने के लिए है। यह लॉकिंग POSIX में परिभाषित है, और ऑपरेटिंग सिस्टम में पोर्टेबल होगा।

लिनक्स में, आप अन्य प्रक्रियाओं द्वारा कौन सी फाइलें खोली गई हैं, यह देखने के लिए उपयोगिता lsof उपयोग कर सकते हैं।

यह आपके लिए अनुमतियों के लिए सीमित है - आपको एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में चेक करना है, या आपको केवल उसी उपयोगकर्ता द्वारा खोले गए फाइलों के परिणाम मिलेंगे, जो चेक कर रहे हैं।

मुझे केवल कमांड लाइन उपयोगिता के बारे में पता है, न कि किसी भी सिस्टम कॉल के जिसे आप सीधे सी कोड से उपयोग कर सकते हैं।

लिनक्स में, किसी दिए गए फाइल सिस्टम (माउंट-ओ mand) के लिए mandatory locking चालू करना भी संभव है, और फ़ाइल (chmod g-x, g + s) पर विशेष झंडे सेट करना भी संभव है। फिर जब आपकी प्रक्रिया एक लिखने के लॉक को प्राप्त करने का प्रयास करती है, तो यह विफल हो जाएगी यदि किसी अन्य प्रक्रिया में फ़ाइल खुलती है। इसका शायद ही कभी उपयोग किया जाता है, लेकिन यदि आप पूरी तरह से सिस्टम को नियंत्रित करते हैं, तो यह एक विकल्प हो सकता है।

+1

मैंने यह देखने के लिए एक बार स्रोत कोड को देखने का प्रयास किया कि उन्होंने यह कैसे किया और मेरा सिर लगभग विस्फोट हुआ। Lsof का स्रोत पागलपन और काले जादू का एक वेब है। –

+2

मैं lsof पर fuser का उपयोग करने का सुझाव देना चाहूंगा। परिणामों को पार्स करना बहुत आसान होगा। – AFoglia

2

निम्नलिखित कोड काम कर सकते हैं।

int main(int argc, char ** argv) 
{ 
    int fd = open(argv[1], O_RDONLY); 
    if (fd < 0) { 
     perror("open"); 
     return 1; 
    } 

    if (fcntl(fd, F_SETLEASE, F_WRLCK) && EAGAIN == errno) { 
     puts("file has been opened"); 
    } 
    else { 
     fcntl(fd, F_SETLEASE, F_UNLCK); 
     puts("file has not been opened"); 
    } 

    close(fd); 
    return 0; 
} 
संबंधित मुद्दे

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