Ouvrir le lecteur CD

Résolu/Fermé
NiicoDu42 Messages postés 157 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 20 mars 2017 - 21 mars 2013 à 20:15
 Utilisateur anonyme - 25 mars 2013 à 19:56
Bonjour,
Je cherchais sur google depuis un petit moment comment ouvrir/fermer le lecteur CD en langage C. J'ai vu que c'était possible avec Windows mais je n'ai rien trouvé pour Linux Ubuntu.
Merci pour vos réponses ! :D


A voir également:

2 réponses

Utilisateur anonyme
23 mars 2013 à 09:39
Salut, il y a la commande "eject" pour ejecter le CD. Donc si tu lances cette commande avec exec(3), le lecteur s'ouvre. Par contre, il faut dupliquer le processus courant car les commandes exec(3) terminent le processus.
Bref, en gros ça donne ça :

#include <stdio.h>
#include <unistd.h>

int main(void) {
  if (fork() == 0) {
    // Execution de 'eject' (commande shell) dans le processus fils
    execlp("eject", "eject",(char*)NULL);
  }
  else {
    // Suite du programme
  }
  return 0;
}
0
NiicoDu42 Messages postés 157 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 20 mars 2017 10
23 mars 2013 à 14:52
Nickel ! tout marche ! ...
Mais peux-tu m'expliquer la ligne :
execlp("eject", "eject",(char*)NULL);

Le "fork" j'ai compris ! :D
0
Utilisateur anonyme
23 mars 2013 à 18:37
Alors, la fonction exec(3) permet d'exécuter un programme. Il en existe différentes :
execlp, execv, execvp... Plus d'info ici : https://linux.die.net/man/3/exec

A noter que les fonction execL* prennent les paramètres du programme les uns après les autres. Ex : arg0, arg1, arg2...
Et que les fonction execV* prennent un tableau de char* contenant les paramètres.

execlp permet de ne pas préciser le chemin complet du programme. C.a.d qu'on a pas besoin de marqué : "/bin/eject", mais "eject" suffit.
Ensuite, on envoie à execlp le premier paramètre, qui est le nom de l'exécutable "eject".
Le deuxième paramètre est le premier paramètre de l'exécutable. Je ne me rappel plus bien pourquoi on doit remettre le nom du programme, il faudrait lire attentivement la manpage.
Bref. Et le dernier argument DOIT (c'est la manpage qui le dit) être un pointeur null. Surement parce que si ton programme prend des arguments (la syntaxe est arg0, arg1, arg2...) alors ce pointeur permet de savoir que c'est la fin de la liste des arguments. Il est dit aussi dans la manpage que c'est plus "propre" de caster ce pointeur en char*.

Et les fonctions exec mettent fin au programme, donc on se sert de ces bons vieux fork.

Désolé pour cette explication un peu bancale et imprécise, mais je ne me rappel plus trop.
0
NiicoDu42 Messages postés 157 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 20 mars 2017 10
23 mars 2013 à 20:26
Parfait ! Je n'aime vraiment pas ne pas comprendre donc je te remercie de cette explication plutôt claire ! :D
Mais ... "Le deuxième paramètre est le premier paramètre de l'exécutable." Dans l'exécutable "eject" on peut rentrer plusieurs paramètres ? comme pour fermer le lecteur par exemple ?
0
Utilisateur anonyme
25 mars 2013 à 19:36
" comme pour fermer le lecteur par exemple ?"

$ man eject
;-)

Bon allez, c'est la commande eject -t (pas supportée par tous les lecteurs)

Donc en C, avec execlp :

execlp("eject","eject","-t",(char*)NULL);
0
NiicoDu42 Messages postés 157 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 20 mars 2017 10
Modifié par NiicoDu42 le 25/03/2013 à 19:48
Haa voilà mon erreur ! je mettais : execlp("eject","eject -t",(char*)NULL);
Mais ... ;)
Le lecteur supporte en console : eject -t
Alors que dans le programme lorsque je met cette ligne : execlp("eject","eject","-t",(char*)NULL); tout se compile mais erreur lors de l'exécution ... :'(
0
Utilisateur anonyme
25 mars 2013 à 19:56
Ben après je ne peux pas t'aider, mon lecteur est "incrusté" et du coup j'obtient une erreur.

Si tu veux savoir ce qu'il se passe, débug ton programme (avec gdb par exemple) et/ou récupère la valeur renvoyée par execlp (-1 en cas d'erreur) et affiche le message à partir de errno (qui est mis à jour par exec(3))
0