前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >检测Linux系统是否支持某系统调用

检测Linux系统是否支持某系统调用

作者头像
一见
发布2018-08-06 19:24:48
3.4K0
发布2018-08-06 19:24:48
举报
文章被收录于专栏:蓝天蓝天

check_syscall.zip 随内核版本的变化,会增加一些新的系统调用,但如果glibc没有跟上,则不能直接调用,这个时候可以自己包装一下。如果想知道内核是否支持某系统调用,先得知道它的系统调用ID号,下面代码即是用来检查是否支持epoll_create1:

  1. // 文件名: x.cpp
  2. // 编译: g++ -g -o x x.cpp
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <stdint.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #ifndef __NR_epoll_create1
  10. # if defined(__x86_64__)
  11. # define __NR_epoll_create1 291
  12. # elif defined(__i386__)
  13. # define __NR_epoll_create1 329
  14. # elif defined(__arm__)
  15. # define __NR_epoll_create1 (UV_SYSCALL_BASE + 357)
  16. # endif
  17. #endif /* __NR_epoll_create1 */
  18. // 2.6.27内核才支持epoll_create1
  19. // glibc2.9开始提供epoll_create1
  20. static inline int epoll_create1(int flags)
  21. {
  22.     return syscall(__NR_epoll_create1, flags);
  23. }
  24. int main()
  25. {
  26. int efd = epoll_create1(0);
  27. if (-1 == efd)
  28. {
  29. // 如果不支持,则会输出:epoll_create: Function not implemented
  30.         perror("epoll_create");
  31. exit(1);
  32. }
  33. // 走到这里,表示支持该系统调用
  34.     printf("epoll_create1 supported\n");
  35.     return 0;
  36. }

相关头文件: /usr/include/bits/syscall.h /usr/include/asm/unistd.h /usr/include/asm/unistd_32.h /usr/include/asm/unistd_64.h /usr/include/asm/unistd_x32.h

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-09-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档