Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2893 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C]Comment récupérer une saisie clavier ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C]Comment récupérer une saisie clavier ?

n°2118589
Blobblob02
Posté le 28-12-2011 à 19:35:21  profilanswer
 

Salut a tous,  
 
J'aimerais savoir comment il était possible de récupérer des saisies clavier dans un programme en C, le but est à terme d'obtenir un minishell.
Après avoir lancer le binaire, il s'affiche un prompt et je dois ensuite taper des commandes...
Sauf que je ne vois pas comment récupérer des saisies claviers après avoir lancer le binaire ?!?
Peut-on faire cela avec Read ? Comment doit-on procéder ?  
 
Merci d'avance pour vos réponses ! :)

mood
Publicité
Posté le 28-12-2011 à 19:35:21  profilanswer
 

n°2118594
Trap D
Posté le 28-12-2011 à 20:29:59  profilanswer
 

Renseigne-toi sur fgets et stdin.

n°2118598
Blobblob02
Posté le 28-12-2011 à 21:35:27  profilanswer
 

Justement, je me suis renseigné, et ceux-ci ont l'airs plus simple d'utilisation que read, mais je n'ai le droit d'utiliser que la fonction read... :s

 

je pense m'orienter sur:

 

while(1)
{
read(0, buffer, 8200)
}

 

et dès que je rencontre un '\n' je lance le processus d'execution de commande.

 

Qu'en pensez-vous ?

 

PS: 8200 étant la taille maximum du buffer.

Message cité 1 fois
Message édité par Blobblob02 le 28-12-2011 à 21:36:02
n°2118620
Trap D
Posté le 29-12-2011 à 08:47:20  profilanswer
 

Blobblob02 a écrit :

while(1)
{
read(0, buffer, 8200)
}
 
et dès que je rencontre un '\n' je lance le processus d'execution de commande.


Je ne connais pas bien l'utilisation de read, mais je pense qu'il faut plutôt faire une boucle du genre  

Code :
  1. do
  2. {
  3.    nblus = read(0, buffer, 8200)
  4. } while (nblus == 8200)

puis regarder pourquoi nblus n'est pas égal à 8200.
Une lecture attentive de http://www.linux-kheops.com/doc/ma [...] ead.2.html peut-être intéressante !
Je ne connais pas la valeur de  SSIZE_MAX il faut vérifier si elle dépasse 8200 ou non.

n°2118638
gilou
Modérateur
Modzilla
Posté le 29-12-2011 à 10:51:08  profilanswer
 

Je verrais plutôt un truc style
 

int count;
while(1)
{
  count = read(0, buffer, 8200);
  if (count > 0 || count < 8200 || ((count == 8200) && (count[8199] == '\n'))) {
   // executer ..
  }
}


En supposant bien sur que SSIZE_MAX >= 8200
A+,


Message édité par gilou le 29-12-2011 à 10:52:24

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2118744
Blobblob02
Posté le 29-12-2011 à 22:09:37  profilanswer
 

Impeccable sa marche très bien, merci :) !

 

J'ai plutôt bien avancer dans mon minishell. Cependant, un autre problème viens de surgir :s

 


Donc après avoir lu ma commande je l'envoie a ma fonction find_cmd qui prend en paramétre le buffer (La commande passé entière, \n compris) puis l'environnement (envp pas d'utilité pour l'instant, pour plus tard avec execve)
Donc je check la commande que j'envoie dans le char *commande celle-ci est prête à l'emploi.
Je fait ensuite appel à la fonction recup_args qui doit me renvoyer les autres mots (les options de la commande) dans un tableau de char *.

 

Voici les erreurs de compilation :

 

cc    -c -o my_put.o my_put.c
cc    -c -o my_annexe.o my_annexe.c
cc    -c -o my_shn.o my_shn.c
my_shn.c: In function ‘find_cmd’:
my_shn.c:61:13: attention : assignment makes pointer from integer without a cast
my_shn.c: Hors de toute fonction :
my_shn.c:64:8: erreur: conflicting types for ‘recup_args’
my_shn.c:61:15: note: previous implicit declaration of ‘recup_args’ was here
my_shn.c: In function ‘recup_args’:
my_shn.c:80:7: attention : cette fonction retourne l'adresse d'une variable locale
make: *** [my_shn.o] Erreur 1

 

Savez-vous ou j'ai fait une erreur ?

 

PS: J'utilise un makefile, my_put.c contient les fonctions de style put_string put_char put_nbr


Message édité par Blobblob02 le 01-01-2012 à 18:03:12
n°2118784
gilou
Modérateur
Modzilla
Posté le 30-12-2011 à 13:49:01  profilanswer
 

Fais une déclaration de recup_args
char   **recup_args(char *buffer, int i, char *commande);
avant sa première utilisation dans find_cmd
arguments = recup_args(buffer, i, commande);
parce que sinon, le compilo va appliquer une déclaration par défaut (c'est ce que veux dire le implicit declaration du message d'erreur) qui aura pas les bon types, d'ou les conflits de typage.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2118809
Blobblob02
Posté le 30-12-2011 à 20:19:49  profilanswer
 

Ah oui effectivement, bétise de ma part :s  je voulais avoir un code qui découlais du haut vers le bas :p  
 
il ne me reste plus que le warning de la variable locale.
 
Merci ! :)

n°2118820
Blobblob02
Posté le 30-12-2011 à 23:19:05  profilanswer
 

Je reviens a vous dans ce post, certes on s'éloigne un peu du titre, mais c'est toujours dans la continuité de mon minishell, donc je ne trouve pas d'utilité a faire un autre sujet

 

Voila mon code reformater:

 


Mon problème: un petit problème dans tri_selectif(Désolé au passage pour le nom de fonction bidon :p),

 

-ma fonction me met bien le NULL à la fin du tab mais apparement arguments[z] = stock;  ne fonctionne pas.

 

Je désire en effet copier chaque mot dans le tableau, commande y compris, pour ensuite envoyer tout sa a execve etc etc.

 

Donc j'ai une chaine de caractère tampon "stock" qui est la commande ou l'option épuré de tout espaces, tabs et '-' que je veut copier dans la case de mon tableau puis la suivante dans la case d'après etc.

 

Mais après differents test, put_str(arguments[0]); etc cela n'affiche rien, c'est donc un problème de copie entre le char * tampon et le tableau, sauf que je ne vois pas ou j'ai fait une erreur.

 

Merci d'avance.


Message édité par Blobblob02 le 01-01-2012 à 18:03:39
n°2118830
Terminapor
I'll see you rise.
Posté le 30-12-2011 à 23:58:59  profilanswer
 

Par hasard, le soucis viendrait pas du 'free(stock)' ? Techniquement ça libère les données à l'adresse de stock, que tu fais passer dans arguments[z] :D
 
Aussi, t'as plein de fonction en int qui sont plutôt supposée être en void étant donné qu'elles ne renvoient rien ;)


---------------
Perhaps you don't deserve to breathe
mood
Publicité
Posté le 30-12-2011 à 23:58:59  profilanswer
 

n°2118845
Blobblob02
Posté le 31-12-2011 à 10:48:33  profilanswer
 

Oui mais je copie stock dans arguments[z] avant de free ...
arguments[z] = stock;  
 
Parce que stock n'est qu'une variables tampon que j'utilise pour stocker la commande et les arguments épuré un a un dans le tableau.
Comment faire pour assigner la valeur de stock dans arguments[z] ? puisqu'apparement ça le fait pas :p

n°2118865
breizhbugs
Posté le 31-12-2011 à 15:28:37  profilanswer
 

Non la tu fait juste une affectation de pointeur, tu ne copie pas les données pointées par le pointeur.
Pour la copie de chaine de caractère, faut utiliser strcpy(arguments[z], stock);


---------------
Seul Google le sait...
n°2118866
Blobblob02
Posté le 31-12-2011 à 15:30:39  profilanswer
 

effectivement :) merci :)

n°2118869
Blobblob02
Posté le 31-12-2011 à 16:28:50  profilanswer
 

Rofl, vraiment désolé d'encore venir vous importuner mais j'ai un problème avec execve...
Donc j'ai épurer les commandes, arguments, je les ais placé dans: une chaine de caractères pour la commande et un tableau de chaines de caractères pour les arguments (arguments[0] = commande  comme demander pour la fonction) qui se finis par NULL.
Je fork et j'envoie commande ainsi qu'arguments a execve.

 

Voila le code du programme:

 

Voici les messages d'erreurs a la compilation:

 

test-ls.c: In function ‘main’:
test-ls.c:49:7: attention : passing argument 2 of ‘execve’ from incompatible pointer type
/usr/include/unistd.h:548:12: note: expected ‘char * const*’ but argument is of type ‘char *’

 

Le compilo sort tout de même un exécutable et celui Claque également un Command not found.\n

 

Donc je pense que j'doit pas avoir compris execve ... Pourriez-vous m'éclairer ? Savez-vous ou je fail ^^ ?

 

Merci d'avance

 

Encore merci pour vos réponses précédente et bon nouvel an au passage. :)


Message édité par Blobblob02 le 01-01-2012 à 18:04:02
n°2118877
gilou
Modérateur
Modzilla
Posté le 31-12-2011 à 18:14:52  profilanswer
 

dans unistd.h (qui est inclus en tête), on a:
int execve (const char *fichier, char * constargv [], char * constenvp[]);
ce qui n'est pas du tout compatible avec ton appel
ret = execve("ls", "ls" "la", envp);
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C]Comment récupérer une saisie clavier ?

 

Sujets relatifs
[C Multitâche] Récupérer un string sur stdinLes fichiers en C
Débutant - Récupérer les données d'un post[C#] Cacher des méthodes d'une interface
[C][OSX][LibSDL] Compilation OK, mais problème d'exécution...[C] Tri par insertion simple & pointeurs de dates
[Objective-C] Récupérer une variable d'un vueRécupérer la valeur "top" d'un div ?
Plus de sujets relatifs à : [C]Comment récupérer une saisie clavier ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR