बस शीर्षक की तरह कहते हैं, यह मैं एक फ़ाइल वर्णनकर्ता epoll के साथ एक निर्देशिका है कि रजिस्टर, यह क्या करता है?एपोल फ़ाइल डिस्क्रिप्टर के साथ क्या करता है जो निर्देशिका को संदर्भित करता है?
उत्तर
कुछ भी नहीं - एफडी इच्छा (कम से कम सामान्य लिनक्स फाइल सिस्टम के लिए) कॉल करने के लिए कॉल 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
अपनी निर्देशिका फ़ाइल ऑब्जेक्ट्स पर विधियों को परिभाषित करें, लेकिन मुझे संदेह है कि कई लोग करते हैं।
है? बस एक शैली सवाल है। 'Opendir' का उपयोग करके जादुई रूप से एफएस समर्थन मतदान नहीं करता है। – schmichael
'dirfd (opendir (" ... "))' अधिक पोर्टेबल, तो शायद सामान्य रूप में पसंद किया जाता है है। मैं एक लिनक्स कर्नेल हैकर हूं, इसलिए मैं व्यक्तिगत रूप से सिस्टम-कॉल इंटरफ़ेस का उपयोग करने के लिए डिफ़ॉल्ट रूप से डिफ़ॉल्ट होता हूं, भले ही यह सबसे उपयुक्त न हो, क्योंकि मैं इसे बेहतर जानता हूं। स्पष्ट रूप से यहां वास्तव में कोई फर्क नहीं पड़ता, क्योंकि 'एपोल' भी लिनक्स विशिष्ट है। – nelhage
आप लिनक्स पर फाइल सिस्टम की घटनाओं की निगरानी करना चाहते हैं, तो का उपयोग [ 'inotify'] (http://linux.die.net/man/7/inotify)। '; |' Dirfd (opendir ("/ tmp")) '' खुला (O_DIRECTORY पथ, O_RDONLY) से अधिक पसंद – jxh