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 :

[TUI][Konsole][SuSE 15.2] Soucis avec une redirection de fichier texte


Sujet :

Linux

  1. #1
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut [TUI][Konsole][SuSE 15.2] Soucis avec une redirection de fichier texte
    Greetings,

    J'ai l'habitude de faire des outils de test en TUI (Terminal User Interface) et je me base sur une librairie que j'ai conçu pour mes besoins personnels.
    Cette librairie essentiellement permet de dessiner des fenêtres en mode "drawbox" dans la zone unicode prévue à cet effet (U2500).

    Donc à priori elle ne devrait pas générer d'effets de bords et puis je l'utilise depuis un moment sans avoir vraiment de gros soucis.

    Mais récemment j'ai observé quelque chose de bizarre et j'ignore comment contourner la problématique.

    Contexte: mon application va lire un texte et déterminer -- sur base de l'alphabet latin -- de quelle langue il s'agit, en fonction de données statistiques sur les occurences de certaines lettres contenues dans ces textes.
    Pour l'écriture je me suis basé sur un texte en anglais assez court (296 octets) que j'ai placé dans une variable globale juste pour -- au minimum -- mettre en place le mécanisme d'analyse du texte et effectuer le calcul des occurences des lettres contenues dans le texte.

    J'ai réservé 512 octets pour cette chaîne de caractères.

    Quand je lance l'application, je n'ai aucun soucis, ça fonctionne (un petit bug avec les regex qui "laissent passer" des caractères de ponctuation alors que j'ai spécifié la classe [:alpha:] mais bon je contourne le soucis et je m'y appliquerais après)
    Par contre lorsque je cherche à "injecter" (rediriger) un fichier texte, là, ça part en sucette.

    Le fichier texte en question contient 324 bytes, la zone mémoire réservée pour le cas où il y aurait une "redirection détectée" est de 4Mb.
    Pourtant j'observe un "effet de bord", en effet les variables permettant de déterminer le nombre de lignes et de colonnes contiennent des valeurs absurdes.

    Comme je fais l'appel de la fonction en tout début de programme, même avec gdb, je ne peux que constater qu'effectivement ces valeurs sont absurdes.

    En mode "normal" ma console (Konsole, virtuelle) mes logs indiquent en plein écran des valeurs comme 235x59... alors qu'en mode "redirigé" j'obtiens notamment 65341x21744, ou 11430x21744, ou 62000x9456.
    Comme les valeurs sont aléatoires je supposes qu'il s'agit d'un écrasement de ces variables à un moment donné par je ne sais quelle instruction.

    Voici la fonction incriminée, c'est celle-ci qui montre un certain "non déterminisme" (j'essaye d'utiliser des termes qui me donnent un air de scientifique) dans les valeurs récupérées en fonction du "mode":

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void GetConsoleDimensions(unsigned int *colonnes,unsigned int *lignes)
    {
    	struct winsize Dimensions;
    	ioctl(0, TIOCGWINSZ, &Dimensions);
     
    	*lignes=Dimensions.ws_row;			
    	*colonnes=Dimensions.ws_col-2;
    }

    Je me base sur ioctl() pour récupérer les dimensions du terminal en terme de lignes et de colonnes.
    Il y a une légère différence dans les types entre unsigned short dans la structure winsize et unsigned int dans mes paramètres de fonction.

    Voici la partie des instructions qui sont inciriminées:

    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
    ClearScreen();
    GetConsoleDimensions(&uiWidth,&uiHeight);
    sprintf(Debug,"Dimensions de la console: %03u,%03u",uiWidth,uiHeight);
    Log(Logs,Debug);
     
    char inputfromcommand=nbgetchEx();
    if(inputfromcommand!=-1)
    {
      sprintf(Debug,"Redirection détectée !!");
      Log(Logs,Debug);
     
      txtFromCommand[position]=inputfromcommand;
      position++;
      do
     {
    	inputfromcommand=nbgetchEx();
    	txtFromCommand[position]=inputfromcommand;
    	position++;
      }while(inputfromcommand!=-1 && position<CHUNKSIZE);
      sprintf(Debug,"Texte redirigé (taille: %05d)",position);
      Log(Logs,Debug);
    }
     
    Fenetre=DrawTitledBoxWithRGB(1,1,uiHeight-3,uiWidth,getRGB(200,200,200,true),"[Déterminer la langue]",(struct s_RGB){0},COLORED_BOTH);
    AlphabetLatin=DrawTitledBoxWithRGB(Fenetre.Width-16,2,26,16,getRGB(200,200,200,true),"[Analyse]",(struct s_RGB){0},COLORED_BOTH);
    Nom : situationnormale000.png
Affichages : 248
Taille : 37,4 Ko
    En gros c'est ce que je suis censé obtenir de manière idéale...
    Je ne saurais pas afficher évidemment le résultat lorsque je fais une redirection vu les valeurs absurdes que j'obtiens en sortant de GetConsoleDimensions().

    Voici ce que j'obtiens quand je passe par gdb... en "mode redirigé"...
    Nom : debug000.png
Affichages : 258
Taille : 130,3 Ko

    Je ne sais pas faire grand chose... du fait que cela se passe via ioctl() au tout début de mon programme.

    Question: que peut-il bien se passer ?

    Pistes: je pourrais laisser tomber la détection d'une redirection et passer par des paramètres en ligne de commande...
    Peut-être que le "mode" TUI ne convient pas pour les redirections (je n'ai pas d'exemples de TUI en tête qui effectivement acceptent la redirection de fichiers)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,
    Pouvez-vous vérifier les valeurs contenues dans Dimensions juste après l'ioctl.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Oui... hum... partir du principe que ioctl() fonctionnait systématiquement c'était un peu... comment dire... euh...

    J'ai fait donc des modifs pour récupérer le message d'erreur de ioctl()... et là...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [1652543429.079776415][Sat May 14 17:50:29 2022]	Dimensions de la console: 025,000
    [1652543429.081341802][Sat May 14 17:50:29 2022]	ERREUR (GetConsoleDimensions()) : Ioctl() inappropré pour un périphérique
    [1652543429.081372530][Sat May 14 17:50:29 2022]	Redirection détectée !!
    [1652543429.081626258][Sat May 14 17:50:29 2022]	Texte redirigé (taille: 00325)
    Dans le mécanisme si il y a une erreur dans GetConsoleDimensions() je passe errno dans usWidth (devenu unsigned short du coup)...

    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
    void GetConsoleDimensions(unsigned short *colonnes,unsigned short *lignes)
    {
    	struct winsize Dimensions;
     
    	// 2022
     
    	int errcode=ioctl(0, TIOCGWINSZ, &Dimensions);
    	if(errcode==-1)
    	{
    		*lignes=0;
    		*colonnes=errno;
    		return;
    	}
     
    	*lignes=Dimensions.ws_row;			
    	*colonnes=Dimensions.ws_col-2;
    }

    Donc du coup... il faudra que je me documente sur la signification.

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Oui, je me suis laissé un peu distraire par le message ENOTTY.
    En fait cela devrait être EBUSYDESC pour être plus clair...

    J'utillise ioctl avec le descripteur de fichier 0 (stdin), pour déterminer la taille de la console, or, stdin est BUSY du fait de la redirection.
    J'ai changé STDIN_FILENO en STDERR_FILENO et ça va.

Discussions similaires

  1. [vb6] Soucis avec une instance excel
    Par Little-Freud dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/04/2006, 16h08
  2. [WD9] [Débutant] Souci avec une simple requête
    Par unix27 dans le forum WinDev
    Réponses: 4
    Dernier message: 04/04/2006, 00h54
  3. souci avec une comparaison de date
    Par Ludo75 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/02/2006, 15h59
  4. [MySQL] Soucis avec une insertion dans une base
    Par Ludo75 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/01/2006, 14h03
  5. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56

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