Shell en langage C
moukengue
Messages postés
156
Date d'inscription
Statut
Membre
Dernière intervention
-
moukengue Messages postés 156 Date d'inscription Statut Membre Dernière intervention -
moukengue Messages postés 156 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai un exercice sur linux qui demande de creer un programme en "C" implémentant le script shell. Alors tout de suite j'ai pensé à créer pour chaque commande shell un programme C. Et ensuite avec l'utilitaire Make je pourrais les assembler afin d'obtenir l'exécutable car j'ai eu les diffficultés de réaliser cela dans un seul programme C. Mais jusquelà mes programmes adaptés à chaque commande ne réalisent pas ce que la commande shell associée réalise.
par ex la commande copy j'ai écrit la fonction suivante:
copier(char fich[10], char chemin[10]){
strcpy(chemin,fich);
}
Je ne sais donc pas si je m'y prends mal. Merci pour votre bonne compréhension.
j'ai un exercice sur linux qui demande de creer un programme en "C" implémentant le script shell. Alors tout de suite j'ai pensé à créer pour chaque commande shell un programme C. Et ensuite avec l'utilitaire Make je pourrais les assembler afin d'obtenir l'exécutable car j'ai eu les diffficultés de réaliser cela dans un seul programme C. Mais jusquelà mes programmes adaptés à chaque commande ne réalisent pas ce que la commande shell associée réalise.
par ex la commande copy j'ai écrit la fonction suivante:
copier(char fich[10], char chemin[10]){
strcpy(chemin,fich);
}
Je ne sais donc pas si je m'y prends mal. Merci pour votre bonne compréhension.
A voir également:
- Shell en c
- Classic shell - Télécharger - Personnalisation
- Ssh secure shell download - Télécharger - Divers Web & Internet
- Shell startup windows 10 - Guide
- Shell infrastructure host c'est quoi - Guide
- Shell do while ✓ - Forum Shell
6 réponses
Oulalalala...
Ce que tu viens de faire ne copie pas un fichier mais juste le nom du fichier.
Si tu veux copier un fichier, tu dois
- lire le fichier source
- créer un nouveau fichier vers la destination voulue
- et écrire dans ce fichier, tout le contenu du fichier source !
Cherche copier fichier en C sur google tu trouveras plusieurs trucs !
Tu as de la chance, j'ai du le faire en Assembleur (en 2ème année) ^^
Bon courage !!
Ce que tu viens de faire ne copie pas un fichier mais juste le nom du fichier.
Si tu veux copier un fichier, tu dois
- lire le fichier source
- créer un nouveau fichier vers la destination voulue
- et écrire dans ce fichier, tout le contenu du fichier source !
Cherche copier fichier en C sur google tu trouveras plusieurs trucs !
Tu as de la chance, j'ai du le faire en Assembleur (en 2ème année) ^^
Bon courage !!
Voici le corps du programme pour faire la commande "copy"
int main(int argc, char * argv[]) { if (argc!=3) // nom de la commande, et 2 paramètres { printf("Syntax Error : copy fic_1 fic_2\n"); return 1; } char *fic_1=argv[1]; // paramètre 1 : chemin de l'original char *fic_2=argv[2]; // paramètre 2 : chemin de la copie printf("Copie du fichier"); // instructions de copie printf(" : Terminee !\n"); return 0; }Tu peux bien sûr modifier cette structure pour d'autres commandes
Bonjour, je vous remercie beaucoup du code mais en effet voici le code que j'ai pu écrire mais il me renvoit un message d'erreur prévu que je ne comprends pas:
Le code:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define taillebloc 1024
int main(int argc,char* argv[]){
FILE * f; int source,destination,nb_lus,nb_ecrits;
char buffer[taillebloc];
if(argc==3) {
if((source=open(argv[1],(int)"O_RDONLY| O_BINARY"))>0){
printf("%s %s %d\n",argv[1],argv[2],argc);
if ((destination=open(argv[2],(int)"O_WRONLY|O_CREAT"))<0) printf("Erreur de creation du fichier\n");
else do
{ nb_lus=read(source,(char *)buffer,taillebloc);
if (nb_lus>0) nb_ecrits= write(destination,(char*)buffer, nb_lus);
}while ((nb_lus==taillebloc)&&(nb_ecrits>0));
close(source);
close(destination);
}
else printf("fichier inexistant\n");
}
else printf("le nombre de parametre est insuffisant\n");
}
Lorsque dans l'instruction if ((destination=open(argv[2],(int)"O_WRONLY|O_CREAT"))<0); j'utilise open comme mentionné j'obtiens le message "fichier inexistant" et lorsque j'utilise CREAT j'obtiens plutôt "erreur de creation de fichier" je me demande bien ou je me suis melé les pédales?
Le code:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define taillebloc 1024
int main(int argc,char* argv[]){
FILE * f; int source,destination,nb_lus,nb_ecrits;
char buffer[taillebloc];
if(argc==3) {
if((source=open(argv[1],(int)"O_RDONLY| O_BINARY"))>0){
printf("%s %s %d\n",argv[1],argv[2],argc);
if ((destination=open(argv[2],(int)"O_WRONLY|O_CREAT"))<0) printf("Erreur de creation du fichier\n");
else do
{ nb_lus=read(source,(char *)buffer,taillebloc);
if (nb_lus>0) nb_ecrits= write(destination,(char*)buffer, nb_lus);
}while ((nb_lus==taillebloc)&&(nb_ecrits>0));
close(source);
close(destination);
}
else printf("fichier inexistant\n");
}
else printf("le nombre de parametre est insuffisant\n");
}
Lorsque dans l'instruction if ((destination=open(argv[2],(int)"O_WRONLY|O_CREAT"))<0); j'utilise open comme mentionné j'obtiens le message "fichier inexistant" et lorsque j'utilise CREAT j'obtiens plutôt "erreur de creation de fichier" je me demande bien ou je me suis melé les pédales?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
non, ce n'est pas ça.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/open.2.html
ne pas confondre open() et fopen().
(int)"O_WRONLY|O_CREAT" ceci est une abomination, tu as une chaine de caractère donc un pointeur, que tu cast en entier de type int pour le passé en argument d'une fonction. Cette valeur ne sera pas la même d'une exécution à l'autre car c'est un pointeur !!! Il faut réfléchir 2s à ce que tu écris !
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/open.2.html
ne pas confondre open() et fopen().
(int)"O_WRONLY|O_CREAT" ceci est une abomination, tu as une chaine de caractère donc un pointeur, que tu cast en entier de type int pour le passé en argument d'une fonction. Cette valeur ne sera pas la même d'une exécution à l'autre car c'est un pointeur !!! Il faut réfléchir 2s à ce que tu écris !