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 :

Gestion du terminal


Sujet :

Linux

  1. #1
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut Gestion du terminal
    Bonjour
    Je voudrais savoir ou j'ai faux.
    Je voudrai lire le terminal, mais comme j'utilise des socket avec des write et des read je ne peux pas utiliser ni scanf() ni fgets (bogge rapporté sur les pages de man)

    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
     
    int i,r;
    char msg;
    for(;;)
    {
    	r=read(0, &msg,1) ;
    	if (r == 1)
    	{
    		if (('0' <= msg)&&(msg <= '9'))	
    		{
    			i = i*10+(int)( msg - '0');
    		}
    		else if ((msg == '\n')||(msg == ' '))
    		{
    			printf("fin saisie port\n");
    			break;
    		}
    		else
    		{
    			 i = 0;
    		}
    	}
    }
    ça ne marche pas pour une raison que je ne comprend pas, et j'ai pas d'idée plus simple pour transformer des caractères tapés au clavier en entier. Plus précisement j'ai l'impression qu'on ne va jamais dans la condition (r==1).

    Merci

    // ---------------
    edit read(stdin,,) devient read(0,,) sinon ça ne compile pas

  2. #2
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut Re: [systeme C] gestion du terminal
    Citation Envoyé par gene69
    ni fgets (bogge rapporté sur les pages de man)
    Pardon ?
    Tu confonds avec gets.
    La fonction fgets est tout à fait sécurisée. Rien ne t'empêche de l'utiliser...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut Re: [systeme C] gestion du terminal
    Citation Envoyé par gene69
    Bonjour
    Je voudrais savoir ou j'ai faux.
    Je voudrai lire le terminal, mais comme j'utilise des socket avec des write et des read je ne peux pas utiliser ni scanf() ni fgets (bogge rapporté sur les pages de man)

    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
     
    int i,r;
    char msg;
    for(;;)
    {
    	r=read(stdin, &msg,1) ;
    	if (r == 1)
    	{
    		if (('0' <= msg)&&(msg <= '9'))	
    		{
    			i = i*10+(int)( msg - '0');
    		}
    		else if ((msg == '\n')||(msg == ' '))
    		{
    			printf("fin saisie port\n");
    			break;
    		}
    		else
    		{
    			 i = 0;
    		}
    	}
    }
    ça ne marche pas pour une raison que je ne comprend pas, et j'ai pas d'idée plus simple pour transformer des caractères tapés au clavier en entier. Plus précisement j'ai l'impression qu'on ne va jamais dans la condition (r==1).

    Merci
    Read renvoi le nombre de caractère lu et il me semble qu'elle renvoi un entier que toi tu stocks dans un char donc au mieux si tu lis un caractère r ne sera pas égal à 1 mais à la valeur ascii de 1 ( enfin je pense)

  4. #4
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    merci de vos réponces mais j'insiste.
    http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/fgets.3.txt.html

    Il est fortement déconseillé de mélanger les appels aux
    fonctions de lecture de la bibliothèque stdio avec les
    appels aux fonctions de lecture bas-niveau read() sur le
    descripteur de fichier associé au flux. Les résultats sont
    indéfinis, et très probablement indésirables.
    là est mon problème. et de toute façon j'ai essayé et ça ne marche pas. En plus je ne comprend pas que le read(0,&msg,1) semble être non bloquant et retourne tout le temps -1 alors que read(socket,&msg,1) est blocant....


    Read renvoi le nombre de caractère lu et il me semble qu'elle renvoi un entier que toi tu stocks dans un char donc au mieux si tu lis un caractère r ne sera pas égal à 1 mais à la valeur ascii de 1 ( enfin je pense)
    le prototype est pourtant
    #include <sys/types.h>
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par gene69
    merci de vos réponces mais j'insiste.
    http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/fgets.3.txt.html

    Il est fortement déconseillé de mélanger les appels aux
    fonctions de lecture de la bibliothèque stdio avec les
    appels aux fonctions de lecture bas-niveau read() sur le
    descripteur de fichier associé au flux. Les résultats sont
    indéfinis, et très probablement indésirables.
    là est mon problème. et de toute façon j'ai essayé et ça ne marche pas. En plus je ne comprend pas que le read(0,&msg,1) semble être non bloquant et retourne tout le temps -1 alors que read(socket,&msg,1) est blocant....


    Read renvoi le nombre de caractère lu et il me semble qu'elle renvoi un entier que toi tu stocks dans un char donc au mieux si tu lis un caractère r ne sera pas égal à 1 mais à la valeur ascii de 1 ( enfin je pense)
    le prototype est pourtant
    #include <sys/types.h>
    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
    ebh tu stockes cela dans un char toi Utilise les bons types

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    don't agree

    char* et void* c'est pas la même chose?(en parlant vite) En tout cas j'ai pas de probleme quand je lis mon socket avec ce format. et pas de dépassement de tampon parce que je spécifie la longuer max à lire.

Discussions similaires

  1. Gestion du terminal comme ncurses mais sans ncurses
    Par Celes_Vongola dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/01/2015, 09h57

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