• # Ca fonctionne

    Posté par . En réponse au message Ecrire un module avec un read bloquant. Évalué à 2.

    j'ai finalement réussi a faire un squelette de ma solution, enfin je pense.

    un module test1 reçoit de la donné depuis le userland , le copie dans un buffer d'un module test2 qui peut être lu par le userland. l'application bloque tant qu'il n'y pas de donné.

    J'ai fait deux modules de type filesystem. Les deux ont chacun un buffer alloué par vmalloc (de même taille).
    le module test2 dispose d'une méthode test2_memcpy() qui est déclaré dans un fichier .h

    dans test1.c
    static struct file_operations test1_ops= {
    ....
    .write = test1_write,
    ...
    };


    static ssize_t test1_write(struct file *file, const char *buf, size_t
    count, loff_t *ppos) {
    .....
    copy_from_user((int *)buffer1 + (int)*ppos, buf, ecrits);
    ...
    if( test2_memcpy()(buffer1,buffer1_size) != 0)
    {
    printk(KERN_DEBUG "test2_memcpy failed\n");
    }
    ......
    }

    Dans test2.c:
    static DECLARE_WAIT_QUEUE_HEAD(wq);
    static int flag = 0;
    static struct file_operations test2_ops= {
    ....
    .read = test2_read,
    ...
    };
    static ssize_t test2_read(struct file *file, char *buf, size_t count,
    loff_t *ppos) {
    ...
    wait_event_interruptible(wq, flag != 0);
    flag = 0;
    copy_to_user(buf, (int *)buffer2 + (int)*ppos, lus);
    .....
    };

    int test2_memcpy(char *buf, size_t count)
    {
    buffer2 != memcpy(buffer2, buf, count);
    flag = 1;
    wake_up_interruptible(&wq);
    return 0;
    }
    EXPORT_SYMBOL( test2_memcpy);


    Et ca marche ;-)