就像標題所說的那樣,我註冊了一個文件描述符,它是一個epoll目錄,它有什麼作用?epoll如何處理引用目錄的文件描述符?
回答
Nothing - 註冊fd的請求(至少對於常見的Linux文件系統)將會以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
要弄清楚什麼是怎麼回事,我去了源。 I happen to knowepoll
的大多數行爲由對應於目標文件的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
爲NULL,我們發現在epoll_ctl
系統調用定義一個early on:
/* The target file descriptor must support poll */
error = -EPERM;
if (!tfile->f_op || !tfile->f_op->poll)
goto error_tgt_fput;
由於我們的試驗表明,如果目標文件沒有按不支持poll
,插入嘗試將僅以EPERM
失敗。
其他文件系統有可能在其目錄文件對象上定義.poll
方法,但我懷疑它們有很多。
''dirfd(opendir(「/ tmp」))''優於'open(path,O_RDONLY | O_DIRECTORY);'?只是一個風格問題。使用'opendir'不會讓fs支持民意調查。 – schmichael 2012-08-06 18:22:04
'dirfd(opendir(「...」))'更便於攜帶,所以一般來說可能是首選。我是Linux內核黑客,所以我個人傾向於默認使用系統調用接口,即使它不是最合適的,因爲我知道它更好。顯然這裏並不重要,因爲'epoll'也是Linux特有的。 – nelhage 2012-08-06 18:25:07
- 1. 複製epoll文件描述符
- 2. epoll文件描述符操作
- 3. epoll或kqueue可以處理文件描述符自身的異步添加
- 4. 使用多個文件描述符與epoll的
- 5. 使用帶很少量文件描述符的epoll有什麼好處嗎?
- 6. 返回epoll中的文件描述符的順序是什麼?
- 7. epoll中監視的文件描述符的數量
- 8. 寫入文件描述符時的epoll行爲
- 9. 區分epoll中的文件描述符類型
- 10. 正在爲epoll線程重新安裝文件描述符嗎?
- 11. 對文件描述符引用的對象的引用計數
- 12. 谷歌如何處理href的描述?
- 13. 方法來處理錯誤的文件描述符錯誤
- 14. ISO CopyHere powershell處理泄漏的文件描述符。 Jenkins
- 15. 如何處理CSV文件中的逗號描述
- 16. 文件描述符飢餓和阻斷文件描述符
- 17. 如何使一個文件描述符
- 18. 文件描述符如何工作?
- 19. VC++預處理器符號描述
- 20. 如何處理所有描述
- 21. UNIX守護進程處理文件描述符
- 22. 管道()帶叉()遞歸:文件描述符處理
- 23. 處理文件描述符和SIGKILL信號行爲
- 24. 在線程之間共享相同的epoll文件描述符可以嗎?
- 25. c strcpy文件描述符
- 26. webservice描述符文件
- 27. 關閉文件描述符
- 28. 創建文件描述符
- 29. Linux open()文件描述符
- 30. 實現文件描述符
如果要在Linux上監視文件系統事件,請使用['inotify'](http://linux.die.net/man/7/inotify)。 – jxh 2012-08-06 18:10:17