您的位置:首页 > 运维架构 > Linux

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

2010-04-21 16:40 435 查看
代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐