• linux C 调用系统接口安装模块 范例


    代码
    #include <stdio.h>
    #include 
    <stdlib.h>
    # include 
    <sys/syscall.h>    // syscall() , __NR_init_module
    #include <sys/stat.h>
    #include 
    <errno.h>               // ENOEXEC

    #include 
    <fcntl.h>        // O_RDONLY 
    #include <sys/mman.h>    // PROT_READ , MAP_PRIVATE , MAP_FAILED

    # define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
    # define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)

    #define MPI_NAME "cc_def.ko"

    void moderror(int err)
    {
        
    switch (err) {
        
    case -1/* btw: it's -EPERM */
            printf(
    "no such module");
            
    return;
        
    case ENOEXEC:
            printf( 
    "invalid module format");
            
    return;
        
    case ENOENT:
            printf( 
    "unknown symbol in module, or unknown parameter");
            
    return;
        
    case ESRCH:
            printf(
    "module has wrong symbol version");
            
    return ;
        
    case ENOSYS:
            printf(
    "kernel does not support requested operation");
            
    return ;
        
    default :
            printf(
    "unknown errcode");
            
    return ;
        }
    }

    int main(void )
    {
        
    int len;
        
    char *image;
        
    const char *options;
        
    struct stat st;
        
    int fd;
        
    int ret;

        
    //if (!options)
        options = "";
        
    if ((fd = open(MPI_NAME, O_RDONLY, 0)) < 0) {
                        printf(
    "cannot open module `%s'", MPI_NAME);
            }
                fstat(fd, 
    &st);
                len 
    = st.st_size;
        printf(
    " size : %d",len);
                image 
    = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
                
    if (image == MAP_FAILED) {
            printf(
    "cannot mmap `%s'", MPI_NAME);
            }
        errno
    =0;
        ret
    = init_module(image, len, options);
               
    if (ret != 0) { 
            printf(
    "cannot insert ");
            moderror(errno);
            printf(
    "\n ");
        }
        munmap(image,len);
        
    return 0;
    }
  • 相关阅读:
    Golang的值类型和引用类型的范围、存储区域、区别
    ubuntu下ssh使用 与 SCP 使用
    ubuntu 搭建svn服务器
    Java中Math类的几个四舍五入方法的区别
    mongoDB 批量更改数据,某个字段值等于另一个字段值
    mongoDB 查询附近的人的语句
    mongodb常用操作语句
    JAVA 根据经纬度算出附近的正方形的四个角的经纬度
    JAVA 计算地球上任意两点(经纬度)距离
    Mongodb数据备份恢复
  • 原文地址:https://www.cnblogs.com/leaven/p/1717369.html
Copyright © 2020-2023  润新知