检测Linux系统是否支持某系统调用
生活随笔
收集整理的這篇文章主要介紹了
检测Linux系统是否支持某系统调用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
check_syscall.zip
隨內核版本的變化,會增加一些新的系統調用,但如果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
隨內核版本的變化,會增加一些新的系統調用,但如果glibc沒有跟上,則不能直接調用,這個時候可以自己包裝一下。如果想知道內核是否支持某系統調用,先得知道它的系統調用ID號,下面代碼即是用來檢查是否支持epoll_create1:
相關頭文件:
/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
總結
以上是生活随笔為你收集整理的检测Linux系统是否支持某系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows批处理符号简介、常用Dos
- 下一篇: 关于SVG的viewBox