Salut, je n'y connai absolument rien en programmation, je suis en train de créer un live cd, j'ai presque terminé, récemment je bloquais sur un problème qui était que lorsque j'étaignais mon pc avec mon live cd dedans celui-ci ne s'éjectait pas, heureusement grâce au forum, des personnes m'ont aidé à faire un petit programme qui force l'éjection du CD-rom à la fermeture (ils m'ont donné le code et je n'ai eu qu'à le compiler).
Mais, maintenant il faudrait que une foi que le cd a été éjecté le lecteur se referme avant que le pc ne s'éteigne.
Je cherche donc quelque ligne de C qui me permetrait d'obtenir une petite application qui fermerait simplement le lecteur cd quand on l'exécute.
Merci
# eject -t /dev/cdrom
Posté par symoon . Évalué à 3.
[^] # Re: eject -t /dev/cdrom
Posté par julien pooloots . Évalué à 0.
etc/rc0.d/S90Halt
mount /dev/cdrom
mais le problème, c'est que c'est un live-cd et que le lecteur cd est reconnue comme un hdd. Et bien sure, suivant la machine le hdd n'a pas toujours la même lettre !
Mais je vais quand même essayer.
Merci
[^] # Re: eject -t /dev/cdrom
Posté par julien pooloots . Évalué à 0.
Tant que je suis sur le disque dur c'est bon, mais lorsque je créai mon live cd le script ne fonctionne plus (depuis le live-cd).
Avec ça j'obtient un programme qui m'éjecte le cd du lecteur :
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void){
int fd = -1;
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
if (fd > 0) {
ioctl(fd, CDROM_LOCKDOOR, 0);
close(fd);
}
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
if (fd > 0) {
ioctl(fd, CDROMEJECT, 0);
close(fd);
}
}
Est-ce que quelqu'un pourrait me donner en gros la même chose mais pour le refermer; svp.
Merci
[^] # Re: eject -t /dev/cdrom
Posté par gc (site web personnel) . Évalué à 2.
ioctl(5, CDROMEJECT, 0x804f398) = 0
[gc@meuh /tmp] strace -eioctl eject -t
ioctl(5, CDROMCLOSETRAY, 0x24) = 0
donc je te propose la même chose sauf que tu mets uniquement dans le main :
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
if (fd > 0) {
ioctl(fd, CDROMCLOSETRAY, 0);
close(fd);
}
}
c'est beau strace.
# moi pas comprendre.
Posté par 태 (site web personnel) . Évalué à 2.
Ce que je pige :
Tu as un live cd ;
Tu veux eteindre la machine ;
Ton lecteur cd s'ouvre ;
Tu enleves le cd (ou pas, un programme ne pourra pas voir s'il reste un cd dans ton tiroir tant que ce tiroir est ouvert) ;
Ton lecteur de cd se referme, et ton ordinateur s'eteint calmement.
Le probleme que je vois, c'est le contenu des parentheses. Si ton programme ouvre puis referme le tiroir, ca ne sert a rien. Ce que font les live-cd que je connais, c'est d'ejecter le cd, et de te laisser refermer le bidule a la main (s'il y a besoin, sur les lecteurs mange-disques par exemple, il n'y a pas a fermer quoi que ce soit) avant de continuer l'extinction.
[^] # Désolé, c'est vrai que je suis pas très clair
Posté par julien pooloots . Évalué à 0.
Quand je démarre depuis mon live cd, d'origine sans rien toucher aux fichiers et script, quand je l'éteind, le cd reste dans le pc et je suis alors obligé de le rallumer pour éjecter le cd.
J'ai donc "créé" (d'autres personnes ont fait le boulot pour moi car j'en suis incapable étant donné que je sais pas programmer),un petit programme qui eject le cd nommé force_eject.
Je l'ai placé dans mon repertoire /usr/bin/
ensuite j'ai modifié mon fichier /etc/rc0.d/S90Halt
J'y ai ajouté les lignes suivantes :
/usr/bin/force_eject
echo "APPUYER SUR ENTREE POUR CONTINUER"
read off
eject -t /dev/cdrom
sleep 5s
.....puis la fin du script non modifiée
Donc grace à ça, au moment ou le pc s'éteind, l'ordinateur éjecte le cd et me demande d'appuyer sur entrée(ce qui me laisse le temps d'enlever le cd), ensuite c'est là qu'est le problème, le lecteur cd devrait se refermer tout seul, puis l'ordinateur s'éteindre completement.
Au lieux de ça, il éjecte le cd, me demande d'appuyer sur entrée me
laissant le temps d'enlever le cd, puis me retourne un message d'erreur que je n'ai pas eu le temps de noter mais j'ai eu le temps de voire qu'il me parlai de /dev/cdrom eject.... et il s'éteind le lecteur cd ouvert.
Voila, j'espère que cela vous aidera a mieux comprendre mon problème. :)
Merci.
[^] # re: Meuh GC
Posté par julien pooloots . Évalué à 0.
PS: C'est bizzar, ton post date d'après celui de E H et il apparaît avant ö_Ö !
[^] # Oups, help !!! (ö)
Posté par julien pooloots . Évalué à 1.
donc voila ce que j'ai fait :
vi /home/force_close.c
#include <sys/ioctl.h>
#include <linux/cdrom.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void){
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
if (fd > 0) {
ioctl(fd, CDROMCLOSETRAY, 0);
close(fd);
}
}
Je sauve et je quitte -> :wq
Je tape :
cc /home/force_close.c -o /home/force_close
et voila ce que mon pc me dit:
/home/force_close.c: Dans la fonction « main »:
/home/force_close.c:8: error: `fd' undeclared (first use in this function)
/home/force_close.c:8: error: (Each undeclared identifier is reported only once
/home/force_close.c:8: error: for each function it appears in.)
Que dois-je faire svp
Merci
[^] # Re: J'ai trouvé, euh en fait j'ai pompé sur le prog d'avant !
Posté par julien pooloots . Évalué à 1.
int fd = -1;
juste après le "main"
ce qui donne donc :
#include <linux/cdrom.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
int main(void){
int fd = -1;
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
if (fd > 0) {
ioctl(fd, CDROMCLOSETRAY, 0);
close(fd);
}
}
Alors par-contre je sais pas si c'est nécessaire d'avoir tout ces includes ?
Mais bon, ca marche comme ça :)
Allez je recommence mon live-cd et je test !
Merci tout le monde !!!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.