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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习之旅

Linux笔记(二): WIN 10 Ubuntu 双系统

25430
来自专栏前端大白专栏

关于跨域这几天的总结

17460
来自专栏pangguoming

mongo 3.0 备份和还原数据库 ,及too many positional arguments错误

在mongo 3.0的操作 备份示例 ./mongodump -h localhost -d liongo -o ./ 错误方式: ./mongorestore...

1.1K30
来自专栏Echo is learning

python rpy2,tkinter安装问题解决

17330
来自专栏GreenLeaves

三、公共语言运行时(CLR)简介

二、源代码=>程序集及程序集概念介绍中介绍了源代码通过C#编译器生成程序集(或者可执行应用程序exe)的整个过程,本文主要介绍公共语言运行时与程序集的关系. 1...

24660
来自专栏Petrichor的专栏

Ubuntu: 虚拟机 安装

12230
来自专栏Kotlin入门系列

win7基础 cmd 桌面空白处,按住shift后,通过右键菜单启动cmd窗口

26750
来自专栏河湾欢儿的专栏

nginx服务的快速搭建(跨域)

原文地址https://github.com/gs3170981/nginx_quick 1.下载以后有一个server.js 文件

11310
来自专栏青协工作室

配置JDK环境变量

1.打开所下载的JDK安装包,点击下一步。 ? 2.点击更改可以自行选择安装路径,我这里安装到D盘,所以直接把字母C更改为D即可,然后复制更改后的安装路径(复制...

29650
来自专栏jianhuicode

NPM依赖包版本号~和^的区别及最佳实践

~会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0 ^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的...

9320

扫码关注云+社区

领取腾讯云代金券