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   -
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.
A voir également:

6 réponses

Utilisateur anonyme
 
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 !!
0
ctiti60 Messages postés 1017 Date d'inscription   Statut Membre Dernière intervention   70
 
Plein toi, j'ai fait du Cobol durant mes études :)
0
Utilisateur anonyme
 
Toujours dans les langages à la con on a fait du Scheme et Prolog aussi XD !! mais j'avoue que le Cobol ça roXX ^^
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
0
moukengue Messages postés 156 Date d'inscription   Statut Membre Dernière intervention   1
 
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?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > moukengue Messages postés 156 Date d'inscription   Statut Membre Dernière intervention  
 
J'avoue ne pas connaître les accès aux fichiers en C (j'utilise le C++)
Peut-être cela vient de la localisation de ton fichier, si elle est inférieure à 0, affiche la valeur de destination ça nous en dira peut-être plus sur l'erreur
0
moukengue Messages postés 156 Date d'inscription   Statut Membre Dernière intervention   1
 
ok merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tsou
 
bonjour


l'instruction if ((destination=open(argv[2],"w"))<0);


essayes .
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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 !
0
moukengue Messages postés 156 Date d'inscription   Statut Membre Dernière intervention   1
 
bonjour et merci beaucoup de votre contribution
0