Comment récupérer une saisie clavier ? [C] - C - Programmation
Marsh Posté le 28-12-2011 à 21:35:27
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.
Marsh Posté le 29-12-2011 à 08:47:20
Blobblob02 a écrit : while(1) |
Je ne connais pas bien l'utilisation de read, mais je pense qu'il faut plutôt faire une boucle du genre
Code :
|
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.
Marsh Posté le 29-12-2011 à 10:51:08
Je verrais plutôt un truc style
int count; |
En supposant bien sur que SSIZE_MAX >= 8200
A+,
Marsh Posté le 29-12-2011 à 22:09:37
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
Marsh Posté le 30-12-2011 à 13:49:01
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+,
Marsh Posté le 30-12-2011 à 20:19:49
Ah oui effectivement, bétise de ma part :s je voulais avoir un code qui découlais du haut vers le bas
il ne me reste plus que le warning de la variable locale.
Merci !
Marsh Posté le 30-12-2011 à 23:19:05
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 ),
-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.
Marsh Posté le 30-12-2011 à 23:58:59
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]
Aussi, t'as plein de fonction en int qui sont plutôt supposée être en void étant donné qu'elles ne renvoient rien
Marsh Posté le 31-12-2011 à 10:48:33
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
Marsh Posté le 31-12-2011 à 15:28:37
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);
Marsh Posté le 31-12-2011 à 16:28:50
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.
Marsh Posté le 31-12-2011 à 18:14:52
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+,
Marsh Posté le 28-12-2011 à 19:35:21
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 !