2012-08-06 22 views
10

बस शीर्षक की तरह कहते हैं, यह मैं एक फ़ाइल वर्णनकर्ता epoll के साथ एक निर्देशिका है कि रजिस्टर, यह क्या करता है?एपोल फ़ाइल डिस्क्रिप्टर के साथ क्या करता है जो निर्देशिका को संदर्भित करता है?

+2

आप लिनक्स पर फाइल सिस्टम की घटनाओं की निगरानी करना चाहते हैं, तो का उपयोग [ 'inotify'] (http://linux.die.net/man/7/inotify)। '; |' Dirfd (opendir ("/ tmp")) '' खुला (O_DIRECTORY पथ, O_RDONLY) से अधिक पसंद – jxh

उत्तर

14

कुछ भी नहीं - एफडी इच्छा (कम से कम सामान्य लिनक्स फाइल सिस्टम के लिए) कॉल करने के लिए कॉल EPERM के साथ विफल हो जाता है।

#include <sys/epoll.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 

int main(void) { 
    int ep = epoll_create1(0); 
    int fd = open("/tmp", O_RDONLY|O_DIRECTORY); 
    struct epoll_event evt = { 
     .events = EPOLLIN 
    }; 

    if (ep < 0 || fd < 0) { 
     printf("Error opening fds.\n"); 
     return -1; 
    } 

    if (epoll_ctl(ep, EPOLL_CTL_ADD, fd, &evt) < 0) { 
     perror("epoll_ctl"); 
     return -1; 
    } 
    return 0; 
} 
निम्नलिखित परिणाम के साथ

:

[[email protected]:/tmp]$ make epoll 
cc  epoll.c -o epoll 
[[email protected]:/tmp]$ ./epoll 
epoll_ctl: Operation not permitted 

पता लगाने के लिए क्या यहाँ पर जा रहा था, मैं स्रोत के पास गया

मैं इस निम्नलिखित डेमो प्रोग्राम का उपयोग का परीक्षण किया। मैं happen to know कि epoll के व्यवहार का सबसे struct file_operations पर ->poll समारोह लक्ष्य फ़ाइल के लिए इसी है, जो सवाल में फाइल सिस्टम पर निर्भर करता है से निर्धारित होता है। मैं एक विशिष्ट उदाहरण के रूप में ext4 उठाया, और fs/ext4/dir.c को देखा है, जो definesext4_dir_operations के रूप में इस प्रकार है:

const struct file_operations ext4_dir_operations = { 
    .llseek  = ext4_dir_llseek, 
    .read  = generic_read_dir, 
    .readdir = ext4_readdir, 
    .unlocked_ioctl = ext4_ioctl, 
#ifdef CONFIG_COMPAT 
    .compat_ioctl = ext4_compat_ioctl, 
#endif 
    .fsync  = ext4_sync_file, 
    .release = ext4_release_dir, 
}; 

नोट एक .poll परिभाषा की कमी, जिसका अर्थ यह NULL के लिए शुरू कर दिया जाएगा। तो, वापस epoll, जो fs/eventpoll.c में परिभाषित किया गया है करने के लिए झूलते, हम जांच के लिए poll शून्य होने के लिए लग रही है, और हम एक early onepoll_ctl syscall परिभाषा में मिल: हमारे परीक्षण के रूप में संकेत दिया

/* The target file descriptor must support poll */ 
error = -EPERM; 
if (!tfile->f_op || !tfile->f_op->poll) 
    goto error_tgt_fput; 

, अगर लक्ष्य फ़ाइल नहीं करता है poll का समर्थन नहीं करते हैं, सम्मिलित प्रयास EPERM के साथ बस विफल हो जाएगा।

यह संभव है कि अन्य फाइल सिस्टम .poll अपनी निर्देशिका फ़ाइल ऑब्जेक्ट्स पर विधियों को परिभाषित करें, लेकिन मुझे संदेह है कि कई लोग करते हैं।

+0

है? बस एक शैली सवाल है। 'Opendir' का उपयोग करके जादुई रूप से एफएस समर्थन मतदान नहीं करता है। – schmichael

+0

'dirfd (opendir (" ... "))' अधिक पोर्टेबल, तो शायद सामान्य रूप में पसंद किया जाता है है। मैं एक लिनक्स कर्नेल हैकर हूं, इसलिए मैं व्यक्तिगत रूप से सिस्टम-कॉल इंटरफ़ेस का उपयोग करने के लिए डिफ़ॉल्ट रूप से डिफ़ॉल्ट होता हूं, भले ही यह सबसे उपयुक्त न हो, क्योंकि मैं इसे बेहतर जानता हूं। स्पष्ट रूप से यहां वास्तव में कोई फर्क नहीं पड़ता, क्योंकि 'एपोल' भी लिनक्स विशिष्ट है। – nelhage

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

  • कोई संबंधित समस्या नहीं^_^