[C]Traduire un code shell en C
Fermé
Ikedia
-
13 mai 2006 à 14:41
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 - 15 mai 2006 à 17:05
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 - 15 mai 2006 à 17:05
A voir également:
- [C]Traduire un code shell en C
- Le code ascii en informatique - Guide
- Comment traduire une page - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Traduire un texte en photo - Guide
10 réponses
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
13 mai 2006 à 19:36
13 mai 2006 à 19:36
Est ce que tu peux me dire à quoi correspnd cette commande?
Bonjour,
je suppose que ce code ne correspond à rien
On me demande juste de retranscrire ce code shell en utilisant le C, c'est à écrire sur feuille, donc ne doit pas être compilé
Je ne sais pas comment m'y prendre.
As-tu une idée?
je suppose que ce code ne correspond à rien
On me demande juste de retranscrire ce code shell en utilisant le C, c'est à écrire sur feuille, donc ne doit pas être compilé
Je ne sais pas comment m'y prendre.
As-tu une idée?
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
14 mai 2006 à 11:27
14 mai 2006 à 11:27
Salut,
Si tu dois donner un source pour UNIX/LINUX, regardes du coté des
fonctions système :
fork() : création d'un processus
execlp() : remplacement d'un processus par un autre
open(), read(), write(), close() : primitives de manipulations des fichiers
pipe() : création d'un tube de communication
dup2() : duplication d'un descripteur de fichier ouvert avec un numéro de
descripteur de fichier de ton choix.
Il faut avoir à l'esprit que les descripteurs de fichiers suivant ont des
rôles précis :
0 : entrée standard du processus (saisie au clavier)
1: sortie standard
2 : sortie d'erreur
A+, crabs
Si tu dois donner un source pour UNIX/LINUX, regardes du coté des
fonctions système :
fork() : création d'un processus
execlp() : remplacement d'un processus par un autre
open(), read(), write(), close() : primitives de manipulations des fichiers
pipe() : création d'un tube de communication
dup2() : duplication d'un descripteur de fichier ouvert avec un numéro de
descripteur de fichier de ton choix.
Il faut avoir à l'esprit que les descripteurs de fichiers suivant ont des
rôles précis :
0 : entrée standard du processus (saisie au clavier)
1: sortie standard
2 : sortie d'erreur
A+, crabs
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
exe1 <file -O | exo4 -lix >>results
Voici ce que j'ai fait .
Si quelqu'un pouvait me dire ce qui ne va pas .
Merci d'avance .
Voici le code :
int main (void){
}
Voici ce que j'ai fait .
Si quelqu'un pouvait me dire ce qui ne va pas .
Merci d'avance .
Voici le code :
int main (void){
}
jamel_theone
Messages postés
61
Date d'inscription
dimanche 5 février 2006
Statut
Membre
Dernière intervention
1 décembre 2008
20
14 mai 2006 à 22:44
14 mai 2006 à 22:44
Bein la tu as seulement definie la fonction qui sera le point d'entree de ton programme, mais ca ne fera rien du tout...Je sais pas si c'est exactement ce que tu veux, mais en C, tu peux utiliser la fonction System pour executer la commande telle quelle (vu qu'apparemment c'est une commande aleatoire)
Désolé, j'avais validé alors que je n'vais pas tout tapé
Voici ce que j'ai fait .
Si quelqu'un pouvait me dire ce qui ne va pas .
Merci d'avance .
Voici le code :
int main (void){
int p[2];
pid_t pid;
int fd,fd2;
char tampon[BUFSIZ];
int nb_lus;
if(pipe(p)==-1){
perror("pipe");
exit(1);
}
if(pid=fork()==-1){
perror("fork");
exit(1);
}
if(pid){
close(p[0]);
fd = open("fichier",O_CREAT);
int nb_lus = read(fd,tampon,BUFSIZ);
if(nb_lus == -1){
perror("read");
exit(1);
}
close(fd);
fd2 = open("exe1",O_CREAT|O_TRUNC);
write(fd2,tampon,nb_lus);
}
close(p[1]);
dup2(p[0],0);
execlp("exo4","exo4", "-lix");
}
Voici ce que j'ai fait .
Si quelqu'un pouvait me dire ce qui ne va pas .
Merci d'avance .
Voici le code :
int main (void){
int p[2];
pid_t pid;
int fd,fd2;
char tampon[BUFSIZ];
int nb_lus;
if(pipe(p)==-1){
perror("pipe");
exit(1);
}
if(pid=fork()==-1){
perror("fork");
exit(1);
}
if(pid){
close(p[0]);
fd = open("fichier",O_CREAT);
int nb_lus = read(fd,tampon,BUFSIZ);
if(nb_lus == -1){
perror("read");
exit(1);
}
close(fd);
fd2 = open("exe1",O_CREAT|O_TRUNC);
write(fd2,tampon,nb_lus);
}
close(p[1]);
dup2(p[0],0);
execlp("exo4","exo4", "-lix");
}
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
15 mai 2006 à 05:47
15 mai 2006 à 05:47
Salut,
La commande shell à écrire en C est :
Ton processus doit éxécuter ces traitements :
Lorsque tu utiliser execlp, ne pas oublier de mettre le dernier argument
à NULL et de traiter l'erreur, exemple pour exe1
A+, crabs
La commande shell à écrire en C est :
exe1 <file -O | exo4 -lix >>results
Ton processus doit éxécuter ces traitements :
ETAPE 1 : le pipe entre les deux processus - création d'un pipe mémoire : int p[2] ; pipe( p ) ETAPE 2 : le processus exe1 - creation d'un nouveau processus : la suite c'est le code du fils : fork() - ouvrir en lecture seule le fichier "file" : fdfile = open("file", O_RDONLY) - fermer l'entrée standard en la duplicant avec fdfile : dup2() - fermer la sortie standard en la duplicant avec p[1] - fermer p[0] - remplacer le fils par "exe1 -O" : execlp() ETAPE 3 : le processus exo4 (c'est le processus père du for - creation d'un nouveau processus : la suite c'est le code du fils : fork - ouverture de results en mode ajout : fdresults = open( "results", O_WRONLY|O_CREAT|O_APPEND, 0666); - fermer la sortie standard en la duplicant avec fdresults - fermer l'entrée standard en la duplicant avec p[0] - fermer p[1] - remplacer le process par "exo4 -lix" ETAPE 4 : - fermer p[0] et p[1] - attendre la mort des fils : 2 fois wait() - exit du status le plus défavorable
Lorsque tu utiliser execlp, ne pas oublier de mettre le dernier argument
à NULL et de traiter l'erreur, exemple pour exe1
execlp( "exe1", "exe1", "-O", NULL ) ; perror( "execlp" ) ; /* le execlp c'est mal passé */ exit( 100 ) ;
A+, crabs
Bonjour,
Est-ce que maitenant le programme est bien écrit ?
Est-ce que maitenant le programme est bien écrit ?
int main (void){ int p[2]; int fdfile,fdresults; int status; if(pipe(p)==-1){ perror("pipe"); exit(1); } switch(fork()){ case -1 : perror("fork"); exit(2); case 0: fdfile = open("file", O_RDONLY); dup2(fdfile, 0); dup2(p[1], 1); close(p[0]); execlp("exe1", "exe1", "-O", NULL) ; perror("execlp" ); exit(3); default: fdresults = open("results", O_WRONLY|O_CREAT|O_APPEND, 0666); dup2(fdresults, 1); dup2(p[0], 0); close(p[1]); execlp("exo4", "exo4", "-lix", NULL) ; perror("execlp" ); exit(4); } close(p[0]); close(p[1]); }
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
15 mai 2006 à 17:05
15 mai 2006 à 17:05
Salut,
Tu y es presque...
Il manque un fork() -> dans le 'default' il faut créer un autre processus
pour exo4
Il manque wait() ou waitpid() pour que le père ne meurre pas avant les fils
et que ton système se retrouve avec des processus zombies.
Ton code ne permet d'atteindre les close() hors du switch, car le default fait
un exec.
En programmation système, il est de bon ton de tester tous les codes de
retour des primitives et d'assumer une gestion d'erreur initialement
simplissime : perror() + exit().
A+, crabs
Tu y es presque...
Il manque un fork() -> dans le 'default' il faut créer un autre processus
pour exo4
Il manque wait() ou waitpid() pour que le père ne meurre pas avant les fils
et que ton système se retrouve avec des processus zombies.
Ton code ne permet d'atteindre les close() hors du switch, car le default fait
un exec.
En programmation système, il est de bon ton de tester tous les codes de
retour des primitives et d'assumer une gestion d'erreur initialement
simplissime : perror() + exit().
A+, crabs