国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統 - Linux - Epoll 能監聽普通文件嗎?

Epoll 能監聽普通文件嗎?

2021-05-11 23:27Linux內核那些事songsong001 Linux

epoll 是 Linux 系統中常用的多路復用 I/O 組件,一般用于監聽 socket 是否能夠進行 I/O 操作。那么,epoll 能監聽普通文件嗎?

Epoll 能監聽普通文件嗎?

epoll 是 Linux 系統中常用的多路復用 I/O 組件,一般用于監聽 socket 是否能夠進行 I/O 操作。那么,epoll 能監聽普通文件嗎?

我們先通過下面的例子來驗證一下,epoll 能不能監聽普通文件:

  1. #include <stdio.h> 
  2. #include <sys/epoll.h> 
  3. #include <fcntl.h> 
  4.  
  5. int main() 
  6.    int epfd, fd; 
  7.    struct epoll_event ev, events[2]; 
  8.    int result; 
  9.  
  10.    epfd = epoll_create(10); 
  11.    if (epfd < 0) { 
  12.        perror("epoll_create()"); 
  13.        return -1; 
  14.   } 
  15.  
  16.    fd = open("./test.txt", O_RDONLY | O_CREAT); 
  17.    if (fd < 0) { 
  18.        perror("open()"); 
  19.        return -1; 
  20.   } 
  21.  
  22.    ev.events = EPOLLIN; 
  23.  
  24.    result = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); 
  25.    if (result < 0) { 
  26.        perror("epoll_ctl()"); 
  27.        return -1; 
  28.   } 
  29.  
  30.    epoll_wait(epfd, events, 2, -1); 
  31.  
  32.    return 0; 

編譯并且運行,結果如下:

  1. [vagrant@localhost epoll]$ gcc epoll.c -o epoll 
  2. [vagrant@localhost epoll]$ ./epoll 
  3. epoll_ctl(): Operation not permitted 

可以看到上面的運行結果報 Operation not permitted 的錯誤,這說明 epoll 是不能監聽普通文件的,為什么呢?

尋根究底

 

我們應該對追尋真相抱著熱衷的態度,所以必須找出 epoll 不能監聽普通文件的原因。

因為在上面的例子中,是 epoll_ctl 函數報的錯,所以我們首先應該從 epoll_ctl 的源碼入手,如下:

  1. SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, 
  2.                struct epoll_event __user *, event) 
  3.    int error; 
  4.    struct file *file, *tfile; 
  5.  
  6.   ... 
  7.  
  8.    error = -EBADF; 
  9.    file = fget(epfd);  // epoll 句柄對應的文件對象 
  10.    if (!file) 
  11.        goto error_return; 
  12.  
  13.    tfile = fget(fd);   // 被監聽的文件句柄對應的文件對象 
  14.    if (!tfile) 
  15.        goto error_fput; 
  16.  
  17.    error = -EPERM; // Operation not permitted 錯誤號 
  18.    if (!tfile->f_op || !tfile->f_op->poll) 
  19.        goto error_tgt_fput; 
  20.  
  21.   ... 
  22.  
  23. error_tgt_fput: 
  24.    fput(tfile); 
  25. error_fput: 
  26.    fput(file); 
  27. error_return: 
  28.  
  29.    return error; 

從上面代碼可以看出,當被監聽的文件沒有提供 poll 接口時,就會返回 EPERM 的錯誤,這個錯誤就是 Operation not permitted 的錯誤號。

所以,出現 Operation not permitted 的原因就是:被監聽的文件沒有提供 poll 接口。

由于我們的文件系統是 ext4,所以我們來看看 ext4 文件系統中的文件是否提供了 poll 接口(位于文件 /fs/ext4/file.c 中):

  1. const struct file_operations ext4_file_operations = { 
  2.   .llseek         = generic_file_llseek, 
  3.   .read           = do_sync_read, 
  4.   .write          = do_sync_write, 
  5.   .aio_read       = generic_file_aio_read, 
  6.   .aio_write      = ext4_file_write, 
  7.   .unlocked_ioctl = ext4_ioctl, 
  8.   .mmap           = ext4_file_mmap, 
  9.   .open           = ext4_file_open, 
  10.  .release        = ext4_release_file, 
  11.  .fsync          = ext4_sync_file, 
  12.  .splice_read    = generic_file_splice_read, 
  13.  .splice_write   = generic_file_splice_write, 

ext4 文件的文件操作函數集被設置為 ext4_file_operations(也說就是:file->f_op = ext4_file_operations),從上面代碼可以看出,ext4_file_operations 并沒有提供 poll 接口。所以,當調用 epoll_ctl 把文件添加到 epoll 中進行監聽時,就會返回 Operation not permitted 的錯誤。

從上面的分析可知,當文件系統提供 poll 接口時,就可以把文件添加到 epoll 中進行監聽。

原文鏈接:https://mp.weixin.qq.com/s/HGeHm30pilIFaik2Hi9fBg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久九 | 天天碰天天操 | 国产亚洲精品美女久久久久久久久久 | 人人人人人你人人人人人 | 日本黄色片免费看 | 91av视频在线 | 成人网av| 97久久精品 | 伊人色综合网 | 欧美日韩视频第一页 | a天堂在线 | 狠狠色噜噜狠狠狠8888米奇 | 中文字幕日韩欧美 | www.成人.com| 亚洲视频一区二区 | 国产区第一页 | 一级在线 | 一本久道久久综合狠狠爱 | 亚洲综合在线播放 | 成人av网站在线观看 | 免费久久精品 | 二区视频 | 欧美精品在线看 | 亚洲成人一区二区三区 | 亚洲成av人片在线观看 | 色婷婷一区二区三区 | 成人午夜在线播放 | 成人中文视频 | 国产日韩久久 | 一级片免费在线观看视频 | 久久久久久久成人 | 久久久九九 | 综合久久网 | 日韩在线免费 | 亚洲一区二区免费看 | 久久这里只有精品久久 | 在线视频 中文字幕 | a v黄色| 色综久久 | 成人精品鲁一区一区二区 | 欧美成人精品 |