zoukankan      html  css  js  c++  java
  • 检测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
    ");
        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

  • 相关阅读:
    nasm astrstr函数 x86
    nasm astrspn函数 x86
    nasm astrset_s函数 x86
    nasm astrrev函数 x86
    模板:最长公共子序列(LCS)
    模板:最小生成树(MST)
    模板:并查集
    模板:单源最短路径
    模板:最近公共祖先(LCA)
    模板:线段树(1)——加法,求和
  • 原文地址:https://www.cnblogs.com/aquester/p/9891582.html
Copyright © 2011-2022 走看看