蓝天

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

随内核版本的变化,会增加一些新的系统调用,但如果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

posted on 2015-09-07 09:48  #蓝天  阅读(384)  评论(0编辑  收藏  举报

导航