2016-03-11 2 views
-1

J'ai fait le code suivant pour tester l'utilisation de ioctl et je suis assez confus au sujet des résultats.Comment fonctionne exactement ioctl et comment le faire fonctionner correctement pour les lectures de DVD?

int main(void) 
{ 
    int id; 
    dvd_struct s; 
    id=open("/dev/dvd",O_RDONLY); 
    ioctl(id,DVD_READ_STRUCT,&s); 
    printf("%d,%s,%s",s.bca.len,s.manufact.value,s.disckey.value); 
    close(id); 
} 

d'abord dans manufact et la valeur disckey symboles rares apparaissent, mais ce ne serait pas si important que cela, si elle était pas parce que chaque fois que je lance le programme une nouvelle valeur apparaît, en dépit de garder toujours le dvd dans le lecteur DVD. Même bca.len varie dans chaque exécution, bien qu'il soit vrai qu'il donne toujours un nombre supérieur à 32000 et inférieur à 33000.

Enfin les résultats sont donnés s'il y a un DVD inséré ou pas, donc je me demande où il obtient exactement ceux résultats de, même si c'est la lecture du DVD.

Le dvd est reconnu par le système d'exploitation, car un chat/dev/dvd affiche son contenu d'une manière fine.

Quelqu'un peut-il expliquer pourquoi il fonctionne de cette façon et si je pouvais le faire fonctionner appropiately (je veux dire, obtenir les mêmes résultats au moins pour manufact et les valeurs disckey et en vous assurant l'information est prise à partir du DVD inséré?

Merci pour votre attention.

+0

Je ne sais rien de l'ioctl et comment utiliser cette structure, mais cela semble utile. http://www.tldp.org/LDP/lkmpg/2.4/html/x856.html – Chirality

Répondre

1

Vérifiez la valeur de retour de ioctl. Si elle ne parvient s ne sera pas rempli d'infos.

if (ioctl(id, DVD_READ_STRUCT, &s) < 0) 
{ 
    perror("DVD_READ_STRUCT"); 
    return -1; 
} 

ManBTW vérifie toujours les valeurs de retour de la fonction non vide.

+0

Pourquoi le vote à la baisse? – LPs

1

Merci, pour vos conseils, je suis arrivé à le résoudre via un code similaire à celui-ci qui est inséré avant l'appel ioctl:

memset(&s, 0, sizeof(s)); 
s.type = DVD_STRUCT_MANUFACT; 

Vous devez définir un type pour s et vous aurez la ceux liés à ce type et font la même chose pour chaque type otrher.

+0

Bon à savoir. +1 – LPs