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

C Discussion :

Taille d'une console sous linux


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 40
    Points
    40
    Par défaut Taille d'une console sous linux
    Peut-on connaitre la taille d'une console sous linux dans un prog en C ?

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Code : 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
     
     
    #include <sys/ioctl.h>
     
    void                    get_win_value(int *col, int *win)
    {
      struct winsize        win;
     
      ioctl(0, TIOCGWINSZ, &win); 
    /* aussi 
       ioctl(0, TIOCGSIZE, &win); 
       C'est la meme chose 
    */
      *col = win.ws_col;
      *win = win.ws_row;
    }
    Cette fonction te permettra de recuperer la taille du terminal.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut,

    j'ai une petite question par rapport au bout de code que tu as posté ci-dessus:

    le premier argument de ioctl est un file descriptor en l'occurence celui du periphérique auquel on veut accedé. Alors ma question pourquoi 0 ? et pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int  fd;
     
    fd = open("/dev/tty", O_RDWR);
    ioctl(fd, TIOCGWINSZ, &win);
    ??

    J'avoue que jusqu'a présent je mettais aussi 0 comme premier argument et ca a toujours fonctionner mais je me posais la question comme ca !

    Merci.[/code]

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Citation Envoyé par -keiji-
    Salut,

    j'ai une petite question par rapport au bout de code que tu as posté ci-dessus:

    le premier argument de ioctl est un file descriptor en l'occurence celui du periphérique auquel on veut accedé. Alors ma question pourquoi 0 ? et pas :
    C'est une tres bonne question.
    J'utilise 0 car 0 correspond au bon /dev/ttyXY.

    Mais tu peux tres bien faire un ttyname puis ouvrir et utiliser le fd.
    Ou soit utiliser le /dev/tty qui correspond au terminal controlant le processus en cours.

    Mais pourquoi s'embeter ?

  5. #5
    LFE
    LFE est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 95
    Points : 2 463
    Points
    2 463
    Par défaut
    Une excellente raison est que sur un code trivial de quelques lignes , ca ne pose pas de problème.

    Par contre lorsque tu vas te retrouver avec un projet consequent, l'apparition de 'nombres magiques' est une calamité, tu ne sais pas d'ou ils viennent , ni a quoi ils correspondent.

    Une autre excellentre raison de les éviter est que celafonctionne peut-être très bien chez toi à un moment donné... mais quid sur une autre machine ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    ok merci pour vos réponses

    A+

  7. #7
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    J'ai une autre proposition à te faire : utilise la librairie ncurses. C'est bien plus portable que ioctl ou /dev/ttyXX :-) C'est plus lourd car il faut lier ton programme à lncurses (qu'il faut donc avoir installé), puis il faut initialiser la console avec initscr(), et enfin ne jamais oublié endwin() (en cas de crash du programme, le terminal est "destabilité", il faut appeler la commande bash "reset" pour revenir à la normale).

    Code : 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
    #include <ncurses.h>
    WINDOW *win;
     
    // Initialise la console (surtout ne pas l'oublier !)
    void InitConsole (void)
    {
      // Initialise la librairie ncurses
      win = initscr();
     
      // Active le scrolling dans la console
      scrollok (win,TRUE);
     
      // Utilise le scrolling "hardware" (si disponnible)
      idlok (win,TRUE);
     
      // N'affiche pas la touche press<E9>e (apr<E8>s getch par ex)
      noecho ();
     
      // Reconnait les touches sp<E9>ciales par leur identifiant
      keypad (win, TRUE);
    }
     
    // Ferme la console (surtout ne pas l'oublier !)
    void FinConsole (void)
    {
      endwin();
    }
    Tu compiles avec "-lncurses".
    http://www.gnu.org/software/ncurses/

    ----
    J'allais oublié : tu auras alors
    - COLS = nombre de colonnes
    - LINES = nombre de lignes
    (qui peuvent varier durant l'exécution)
    - move (x,y) : déplacer le curseur (0,0)=haut gauche
    - getyx(win,y,x) : lire la position du curseur
    - getch() : lire une touche. Renvoie un int, pour les touches "étendues" comme les touches fléchées le code est >256 grâce à keypad (win, TRUE) (sinon ça renvoie une liste de séquences d'échappement indigestes ...)
    - clear() : efface l'écran
    - deleteln() : efface la ligne en cours
    - ...

    ATTENTION: ne pas utiliser fgets(tampon,taille,stdin) pour la saisie mais getnstr(tampon,taille) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo(); // active l'écriture des touches lues
    getnstr(txt, taille);
    noecho(); // n'affiche plus les touches lues
    Utiliser refresh() rafrachit l'écran, ce qui évite bien des surprises ...

    Enfin : printf(...) est à remplacer par wprintf(win, ...).

    ---

    Si tu trouves que ça fait bcp de boulot, utilise ma librairie hconsole qui fonctionne sous Windows, Cygwin, MinGW et Linux en utilisant des fonctions unifiées (il n'existe pas de portage officiel de ncurses sous Windows ...).
    http://www.haypocalc.com/telecharge.php
    (dans le code de HaypoCALC, répertoire include)

    @+ Haypo

  8. #8
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 130 281
    Points
    130 281
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LFE
    L'apparition de 'nombres magiques' est une calamité, tu ne sais pas d'ou ils viennent , ni a quoi ils correspondent.
    C'est exact, mais ici, nul besoin d'ouvrir le tty, il suffit d'utiliser la constante STDIN_FILENO à la place du 0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème configuration d'une passerelle sous linux
    Par DiabolOFraisecoca dans le forum Réseau
    Réponses: 5
    Dernier message: 18/11/2005, 10h05
  2. [Système] lancer / kill une application sous linux
    Par Antoine NSG dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 17h06
  3. pb affichage d'une page sous linux
    Par fessebleu dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2005, 15h05
  4. Réponses: 14
    Dernier message: 09/08/2004, 14h42
  5. Affichage d'une image sous linux
    Par Braim dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 25/03/2003, 11h41

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