分享

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

 lifei_szdz 2013-05-28
#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;
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多