IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Comment beeper sous linux ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comment beeper sous linux ?
    Bonjour,

    Je suis néophyte sous Linux. Je m'en sers courament mais ne développe que depuis peu avec. J'aurais voulu faire beeper le haut-parleur de mon PC avec une procédure C. J'ai vu qu'on utilisait sous linux qq chose comme
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /*beep.c*/
    #include <stdlib.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/kd.h>
     
    int main(int argc, char *argv[])
    {
       int fd, time, freq, arg;
       fd = open("/dev/tty0", O_RDONLY);
       if (argc > 2)
       {
           freq = atoi(argv[1]);
           time = atoi(argv[2]);
       } else {
           freq = 400; /* frequency in Hz */
           time = 100;  /* time in millisec */
       }
       arg = (time<<16)+(1193180/freq);
       return ioctl(fd,KDMKTONE,arg);
    }
    Je sais que je ne suis pas sur un forum C mais le choix du forum Linux est justifié : la procédure ci-dessus fonctionne en mode root mais ne produit aucun son en mode user. Si j'ai bien compris, l'explication en serait que le noeud tty est pour tous les utilisateurs autres que root en ReadOnly ... C'est donc cette caractéristique propre à Linux que j'aimerais "contourner". A lire divers forums, il semblerait que faire beeper son PC en mode simple user, et ceci indépendamment de la distribution choisie (kernel 2.6), impose des "contorsions", des adaptations particulières adaptées à chaque distribution, des solutions "maison"... Est-ce le cas ?

    Windowsien, je m'initie sous Ubuntu pour me faire une idée (en Pascal et en C++). Quelque soit l'OS utilisé, j'imagine mal les utilisateurs devoir régler leur station de travail pour entendre le beep d'erreur ou de fin de travail d'une procédure du logiciel. Même si je suis séduit par Linux, je ne m'attendais pas à rencontrer un tel problème de programmation.

    En réalité le problème n'est pas crucial mais sa méthode de résolution (ou non) m'en apprendra certainement beaucoup sur le monde linux et ses pratiques.

    Mais je n'en suis pas là. Commençons par le début : Qq'1 pourrait-il me donner un début de piste ?

    Merci d'avance. Cordialement. Gilles

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ouvre /dev/tty au lieu de /dev/tty0 (évidement ça ne marche que si tu exécutes ton programme dans un tty).

  3. #3
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 382
    Par défaut
    J'avais fait le même essai il y a quelques années.
    En effet, il faut les droits administrateur pour pouvoir piloter un périphérique.
    • Le plus simple est d'utiliser setuid(). C'est relativement sûr si l'UID de root n'est utilisé que le temps nécessaire à l'opération (ici, quelques lignes de code).
    • Le mieux est de développer un pilote. Mais c'est un poil plus compliqué.
    Attention : dans les deux cas, une erreur peut entraîner un plantage violent du système.

    À titre d'exemple, une partie de mon programme, où AdrPortActif est l'adresse du port du HP & AdrPortFreq est l'adresse du chronomètre programmable permettant de régler la fréquence du son.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int main()
    {
    int UIDUtilisateur; // UID de l'utilisateur en cours
        UIDUtilisateur=getuid(); // svg de l'UID de l'utilisateur
        printf("ID utilisateur = %i\n",UIDUtilisateur);
        if (setuid(0)!=0) // on demande les privilèges administrateur
        { // Échec : les privilèges sont refusés
          printf("Droits administrateur refusés\n");
          exit(2);
        }
        else
        {
          /* Get access to the ports - opérations nécessitant les droits administrateur */
          if (ioperm(AdrPortActif, 1, 1))
              {
                perror("IOPerm");
                exit(1);
            }
          if (ioperm(AdrPortFreq, 2, 1)!=0)
              {
                perror("IOPerm");
                exit(1);
            }
            /** Fin des opérations nécessitant les droits administrateur **/
            /**  On rétablit donc les droits de l'utilisateur de base    **/
          if (setuid(UIDUtilisateur)!=0) printf("Droits utilisateur refusés\n"); // on réduit les droits du programme
            else printf("Droits utilisateur de base accordés. UID = %d\n",getuid());

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Vos problèmes de droit c'est parce que vous n'êtes pas proprio du tty... Si comme je le suggère tu ouvres /dev/tty, qui représente ton tty, au lieu de /dev/tty0, tu ne devrais pas avoir ce problème.

    Si tu veux quelque chose de portable, tu peux utiliser curses pour faire beeper ton terminal : man curs_beep

  5. #5
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 382
    Par défaut

    Chez moi :
    crw-rw-rw- 1 root dialout 5, 0 2008-11-03 17:53 /dev/tty
    crw-rw---- 1 root root 4, 0 2008-11-03 18:14 /dev/tty0
    crw------- 1 root tty 4, 1 2008-11-03 17:38 /dev/tty1
    Autrement dit, à part l'administrateur, personne n'est le proprio du périphérique.
    Ce qui est normal, d'ailleurs.
    Par contre, tty accorde le droit d'écriture à tout le monde, ce qui est différent.

    Néanmoins, je ne vois pas en quoi l'usage de /dev/tty donne accès au HP (sauf, peut-être pour un simple bip, mais pas plus).
    Faudra m'expliquer le rapport !

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    /dev/tty c'est un tty qui représente le tty du process courant, c'est tout. Comme tu peux le remarquer tout le monde à le droit de lire et d'écrire dans /dev/tty... Parce que c'est TON tty, donc pas besoin de contrôles d'accès.

    Ensuite ce qu'on peut faire avec, je n'en sais rien... Je disais simplement que comme l'auteur du sujet arrivait à faire ce qu'il veut avec /dev/tty0, il devrait plutôt faire la même chose avec /dev/tty. Ca règlerait ses problèmes de droits.

Discussions similaires

  1. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  2. comment lancer pgadmin sous linux?
    Par mathieu_r dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/05/2005, 14h30
  3. Comment tester si un repertoire est vide sous Linux
    Par chouchouappc dans le forum Linux
    Réponses: 3
    Dernier message: 24/02/2005, 12h03
  4. comment gérer le type HANDLE sous linux?
    Par poune dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/06/2004, 11h12
  5. [TOMCAT] Comment lancer Tomcat sous linux
    Par mathieu dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 26/03/2004, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo