No se puede entender el funcionamiento de read_proc en el módulo del kernel de Linux

Estoy revisando el ejemplo del módulo del kernel en esta página

El read_proc utilizado en el progtwig es el siguiente:

int fortune_read( char *page, char **start, off_t off, int count, int *eof, void *data ) { int len; if (off > 0) { *eof = 1; return 0; } /* Wrap-around */ if (next_fortune >= cookie_index) next_fortune = 0; len = sprintf(page, "%s\n", &cookie_pot[next_fortune]); next_fortune += len; return len; } 

Alguien puede explicar por qué se comprueba que off está mayor que 0. Además, alguien puede explicar cuál es la importancia de los argumentos off y count.

Mi entendimiento hasta ahora es que tenemos que escribir los datos en la página y tenemos que configurar eof cuando los datos han terminado.

Gracias.

off es la posición en el archivo desde donde se deben leer los datos. Esto es como el conjunto de archivos normales. Pero, en el caso de proc_read es algo muy diferente. Por ejemplo, si invoca una llamada de lectura en el archivo proc para leer 100 bytes de datos, el apagado y el recuento en el proc_read serán así:

la primera vez, off = 0, cuenta 100. Digamos, por ejemplo, en su proc_read que solo ha devuelto 10 bytes. Entonces, el control no puede volver a la aplicación de usuario, el kernel llamará a su proc_read con 10 como apagado y contará como 90. Nuevamente, si regresa 20 en el proceso, se llamará nuevamente con off 30, cuente con 70. De esta manera, se le llamará hasta que el conteo llegue a 0. Luego, los datos se escriben en el búfer del usuario dado y su aplicación read () devuelve la llamada.

Pero si no tiene cientos de bytes de datos y desea devolver solo unos pocos bytes, debe establecer el eof en 1. Luego, la función read () regresa inmediatamente.

Para empezar, el siguiente comentario explica mejor que yo.

  /* * How to be a proc read function * ------------------------------ * Prototype: * int f(char *buffer, char **start, off_t offset, * int count, int *peof, void *dat) * * Assume that the buffer is "count" bytes in size. * * If you know you have supplied all the data you * have, set *peof. * * You have three ways to return data: * 0) Leave *start = NULL. (This is the default.) * Put the data of the requested offset at that * offset within the buffer. Return the number (n) * of bytes there are from the beginning of the * buffer up to the last byte of data. If the * number of supplied bytes (= n - offset) is * greater than zero and you didn't signal eof * and the reader is prepared to take more data * you will be called again with the requested * offset advanced by the number of bytes * absorbed. This interface is useful for files * no larger than the buffer. * 1) Set *start = an unsigned long value less than * the buffer address but greater than zero. * Put the data of the requested offset at the * beginning of the buffer. Return the number of * bytes of data placed there. If this number is * greater than zero and you didn't signal eof * and the reader is prepared to take more data * you will be called again with the requested * offset advanced by *start. This interface is * useful when you have a large file consisting * of a series of blocks which you want to count * and return as wholes. * (Hack by Paul.Russell@rustcorp.com.au) * 2) Set *start = an address within the buffer. * Put the data of the requested offset at *start. * Return the number of bytes of data placed there. * If this number is greater than zero and you * didn't signal eof and the reader is prepared to * take more data you will be called again with the * requested offset advanced by the number of bytes * absorbed. */