Bonjour,
J'ai écrit un module linux mais j'ai un comportement étrange lorsque j'essaye d'y accéder par une application.
Pour faire court : lorsque je l'ouvre avec 'cat' cela fonctionne impeccable, lorsque je l'ouvre avec une application cela ne fonctionne pas : le fichier n'existe pas dit le système.
Avec plus de détail :
mon module est un simple character device de type filesystem.
Si je fais
#strace -eopen cat /dev/my_test
......
open("/dev/my_test", O_RDONLY|O_LARGEFILE) = 3
...
Ce la fonctionne.
Maintenant mon programme qui comporte la ligne C ( compilé avec l'option -D_GNU_SOURCE pour avoir droit de faire un O_LARGEFILE) :
fbdesc = open("/dev/my_test", O_RDONLY|O_LARGEFILE );
Cela donne :
#strace -eopen myTest
...
open("/dev/my_test", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
....
Les droits sont les mêmes. Je peux alterner les cat et mon programme le comportement ne change pas.
La je suis sec .....
Une idée?
Merci
# Plus de contexte
Posté par benoar . Évalué à 2.
Genre un peu plus de contexte pour le strace, et les morceaux important de ton programme (quoique, c'est souvent dans les choses "peu importantes" que se trouve l'erreur bête qu'on avait pas vu ...)
[^] # Re: Plus de contexte
Posté par shal . Évalué à 1.
static struct file_operations hello_ops= {
.read = helloRead,
.write = helloWrite,
.open = helloOpen,
.release = helloRelease
};
Avec :
static int helloOpen(struct inode *inode, struct file *file) {
printk(KERN_DEBUG "hello2 open()\n");
return 0;
}
Il y a aussi dans le init (avec major à 0)
ret = register_chrdev(major,HELLO_DEV_NAME,&hello_ops);
printk(KERN_ALERT "MAJOR HELLO2= %d\n",ret);
Je retrouve dans le dmesg le majeur puis je crée mon /dev/my_test : mknod /dev/my_test c 254 0
Si j'essaye de lire /dev/my_test avec cat pas de problème.
Si avec mon programme j'essaye de lire /dev/zero par exemple il fonctionne. mais pas /dev/my_test
J'ai regardé avec valgrind , pas de problème sur mon programme.
Voici un programme de test minimal qui plante :
int main(int argc, char * argv[])
{
int fbdesc;
fbdesc = open("/dev/oco-out", O_RDONLY|O_LARGEFILE );
if(fbdesc == -1)
{
perror("open fb");
exit(-1);
}
close(fbdesc);
exit(0);
}
compilé avec -g -D_GNU_SOURCE -Wall
[^] # Re: Plus de contexte
Posté par benoar . Évalué à 2.
[^] # Re: Plus de contexte
Posté par shal . Évalué à 1.
Le vrai device c'est /dev/oco_out mais pour donner un nom plus explicite je l'ai appelé /dev/my_test dans mes explications.
Le truc c'est que je copie le buffer d'un framebuffer dans un autre module puis une application vas lire a travers /dev/my_test (ou /dev/oco_out) l'image présente dans le framebuffer.
J'ai rajouter un système de synchronisation me permettant de savoir quand une image est disponible.
[^] # Re: Plus de contexte
Posté par benoar . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.