Я попытался реализовать функцию самоопределения рядов и сопоставить их с исходным системным вызовом, который можно вызывать в пользовательском режиме.
sz = write(fd, write_buf, strlen(write_buf));
Способ, которым я перекрываю эти системные ряды, вызывает следующий пример (в ядре )
const struct file_operations my_fops = {
.owner = MY_MODULE,
.read = my_read,
.write = my_write,
.open = my_open,
.release = my_release,
.llseek = my_lseek,
};
static int my_open(struct inode *inode, struct file *file)
{
// my implementation ...
return 0;
}
Хорошо работает, когда я звоню open
, тогда на самом деле будет звонить my_open
. Но что, если тип возврата отличается от системного вызова origin?
Тип возврата read
равен ssize_t
, произойдет сбой компиляции, если я верну самоопределенный тип в функции my_read
.
Мне интересно, есть ли подход, чтобы решить это? Вот что я хочу.
// in user space
my_type sz;
// it will fail cuz return type of write is ssize_t
sz = write(fd, write_buf, strlen(write_buf));
// in kernel space
static my_type fib_write(struct file *file,
const char *buf,
size_t size,
loff_t *offset)
{
return {.upper = 0, .lower = 1};
}