![img_e25d4fb2f8de1caf41a735ec53088516.png](https://yqfile.alicdn.com/img_e25d4fb2f8de1caf41a735ec53088516.png?x-oss-process=image/resize,w_1400/format,webp)
随内核版本的变化,会增加一些新的系统调用,但如果glibc没有跟上,则不能直接调用,这个时候可以自己包装一下。如果想知道内核是否支持某系统调用,先得知道它的系统调用ID号,下面代码即是用来检查是否支持epoll_create1:
- // 文件名: x.cpp
- // 编译: g++ -g -o x x.cpp
- #include errno.h>
- #include stdio.h>
- #include stdint.h>
- #include stdlib.h>
- #include string.h>
- #include unistd.h>
-
- #ifndef __NR_epoll_create1
- # if defined(__x86_64__)
- # define __NR_epoll_create1 291
- # elif defined(__i386__)
- # define __NR_epoll_create1 329
- # elif defined(__arm__)
- # define __NR_epoll_create1 (UV_SYSCALL_BASE + 357)
- # endif
- #endif /* __NR_epoll_create1 */
-
- // 2.6.27内核才支持epoll_create1
- // glibc2.9开始提供epoll_create1
- static inline int epoll_create1(int flags)
- {
- return syscall(__NR_epoll_create1, flags);
- }
-
- int main()
- {
- int efd = epoll_create1(0);
- if (-1 == efd)
- {
- // 如果不支持,则会输出:epoll_create: Function not implemented
- perror("epoll_create");
- exit(1);
- }
-
- // 走到这里,表示支持该系统调用
- printf("epoll_create1 supported\n");
- return 0;
- }
相关头文件:
/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