Распечатка 6.2 Пример функции-заглушки пользовательского пространства |
Предыдущая Содержание Следующая |
Распечатка 6.2
/* kapi-user.c */
#include <fcntl.h> #include "kapi.h"
/* Дескриптор файла для “/dev/kapi” */ int dev_fd;
#define MAX_SIZE 50
int my_kernel_func(int val, char* in_str, char *out_str){
kfunc_t data; int ret_val;
/* Общее число аргументов - три */ data.num = 3;
/* * Аргумент 1. * Даже аргументы-не указатели должны быть переданы как указатели. * Направлением для таких аргументов является DIR_IN */ data.arg[0].val = (void *)&val; data.arg[0].size = sizeof(int); data.arg[0].dir = DIR_IN;
/* Аргумент 2 */ data.arg[1].val = (void *)in_str; data.arg[1].size = strlen(in_str) + 1; data.arg[1].dir = DIR_IN;
/* * Аргумент 3. Так как это аргумент для вывода данных, необходимо * указать размер приёмного буфера */ data.arg[2].val = (void *)out_str; data.arg[2].size = MAX_SIZE; data.arg[2].dir = DIR_OUT;
/* * Возвращаемое значение функции ядра. Установка поля направления * не требуется, так как оно всегда выходное */ data.ret.val = (void *)&ret_val; data.ret.size = sizeof(int);
/* * Наконец, вызываем ioctl для /dev/kapi. Затем драйвер kapi * вызывает функцию ядра my_kernel_func. Она также заполняет * data.ret.val возвращаемым значением функции ядра. */ if (ioctl(dev_fd, MY_KERNEL_FUNC, (void *)&data) < 0){ perror("ioctl failed"); return -1; }
/* Возвращаемое значение функции */ return ret_val; }
|
Предыдущая Содержание Следующая |