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 ;
}

 

你可能感兴趣的:(linux)