2012-08-10 10 views
8

यह "मैन सिलेक्ट" से कोड नमूना है और कुछ वास्तविक रेखाएं पढ़ने के लिए कुछ पंक्तियां हैं जिन्हें लिखा जा रहा है। मुझे संदेह था कि ./myfile.txt को लिखा गया है, select वापस आ जाएगा कि अब वह उस एफडी से पढ़ सकता है। लेकिन क्या होता है कि जब तक txt फ़ाइल मौजूद है तब तक लगातार लूप में लगातार रिटर्न का चयन करें। मैं चाहता हूं कि यह केवल तब लौटाए जब फ़ाइल के अंत में नया डेटा लिखा जाता है। मैंने सोचा कि यह कैसे काम करना चाहिए।नियमित फ़ाइल डिस्क्रिप्टर (गैर-सॉकेट) पर() प्रतीक्षा कैसे कर सकते हैं?

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 

int 
main(void) 
{ 
    fd_set rfds; 
    struct timeval tv; 
    int retval; 

    int fd_file = open("/home/myfile.txt", O_RDONLY); 

    /* Watch stdin (fd 0) to see when it has input. */ 
    FD_ZERO(&rfds); 
    FD_SET(0, &rfds); 
    FD_SET(fd_file, &rfds); 

    /* Wait up to five seconds. */ 
    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    while (1) 
    { 
    retval = select(fd_file+1, &rfds, NULL, NULL, &tv); 
    /* Don't rely on the value of tv now! */ 

    if (retval == -1) 
     perror("select()"); 
    else if (retval) 
     printf("Data is available now.\n"); 
     /* FD_ISSET(0, &rfds) will be true. */ 
    else 
     printf("No data within five seconds.\n"); 
    } 

    exit(EXIT_SUCCESS); 
} 
+0

तो आपका प्रश्न क्या है? ** किसने कहा कि 'चयन' केवल सॉकेट ** पर काम करना चाहिए? – cnicutar

+0

प्रश्न संपादित किया गया। गड़बड़ी के लिए क्षमा। – glutz

+0

'select' का उपयोग _any_ file-type descriptor पर किया जा सकता है, इससे कोई फ़र्क नहीं पड़ता कि यह सॉकेट, फ़ाइल या पाइप या कोई भी डिस्क्रिप्टर है। हालांकि, जब आप फ़ाइल को लिखे गए हैं, तो आप इसे मॉनिटर करने के लिए इसका उपयोग नहीं कर सकते हैं, इसके लिए आपको कुछ ओएस विशिष्ट का उपयोग करना होगा, जैसे कि लिनक्स पर आप [inotify] (http://en.wikipedia.org/wiki/Inotify] का उपयोग कर सकते हैं)। –

उत्तर

13

डिस्क फ़ाइलें हमेशा पढ़ने के लिए तैयार कर रहे हैं (लेकिन पढ़ने यदि आप फ़ाइल के अंत में पहले से ही कर रहे हैं 0 बाइट्स वापस कर सकती है), तो आप एक डिस्क फ़ाइल पर select() उपयोग नहीं कर सकते जब पता लगाने के लिए फ़ाइल में नया डेटा जोड़ा जाता है।

POSIX का कहना है:

फ़ाइल नियमित फाइलों के साथ संबद्ध के हमेशा त्रुटि की स्थिति, पढ़ने के लिए तैयार लिखने के लिए तैयार है, और के लिए सच चयन करेगा।

इसके अलावा, cnicutar के रूप में, अब हटाए गए पोस्ट में इंगित किया गया है, सामान्य रूप से, आपको प्रत्येक पुनरावृत्ति पर FD_SET प्रारंभ करना होगा। आपके कोड में, आप एक एफडी की निगरानी कर रहे हैं, और वह एफडी हमेशा तैयार है, इसलिए एफडी_एसईटी वास्तव में बदल नहीं रहा है। हालांकि, अगर आपके पास मॉनिटर करने के लिए 5 डिस्क्रिप्टर हैं, और select पता लगाता है कि केवल एक तैयार है, तो अगले पुनरावृत्ति पर, केवल एक वर्णक की निगरानी की जाएगी (जब तक आप FD_SET को रीसेट नहीं करते)। यह select मुश्किल का उपयोग करता है।

+1

यह मेरे परीक्षण के आधार पर सही प्रतीत होता है। रफ़ू। – glutz

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