Aide systeme

Résolu
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010 - 16 oct. 2010 à 15:20
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 21 oct. 2010 à 16:41
Bonjour à tous,

Je suis élève ingénieur en informatique en 2 éme année. Je dois faire un TP sur Linux sur la redirection en langage C. J'ai compris le mécanisme de la redirection sous Linux mais, je bloque pour programmer cela en langage C. Pourriez vous me donner des "pistes" afin que je puisse démarrer ?

Je pense que cela fait référence aux processus ainsi qu'aux tubes, non ?

Merci beaucoup de votre aide

Cordialement



J-Ph

8 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 oct. 2010 à 17:20
Regarde du côté de "pipe". Généralement, il faut aussi "forker".

Tiens il y a un exemple/tuto sur ce site:
http://www.cppfrance.com/codes/INITIATION-TUBES-UNIX-PIPE_18294.aspx

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 oct. 2010 à 16:16
Oula, attends.

Il y a une différence entre gérer une redirection (> ou >>) et gérer un cumul de commande (via |) !
Malheureusement les deux sont appelés redirections (les deux sont des redirections, tout simplement).

Peux-tu donner le sujet exact, que je ne t'envoi pas vers une fausse piste ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 16:10
merci, c'est gentil. J'ai regardšŠ le sujet du prof, mais ils nous demandent aussi de gšŠrer les erreurs. Je te passe mon code pour voir si j'ai fait des erreurs. Ce que j'ai fait fonctionne sous linux.

Si j'ai bien compris, le programme doit lorsque l'on l'exšŠcute ecrire ce que l'on lui dit ? Genre, si on šŠcrit toto rentre chez lui, cela s'affiche et si on fait "entršŠe", aller š€ la ligne ? Mais alors qu'en ait il des erreur ?

Merci

J-Ph

Mon code :



#include <stdio.h>
#include <wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define TAILLE_BUF 512

void fils(int *tube)
{
char buffer[TAILLE_BUF] = "\0";
int lu;

close(tube[1]);

/* Tant que la reception a un ecrivain : elle lit */
while( ( lu = read(tube[0], buffer, TAILLE_BUF) ) > 0)
{
buffer[lu - 1] = 0;
printf("Je suis le fils est j'ai a dire : '%s'\n", buffer);
}

close(tube[0]);
puts("Fin du traitement du processus fils");
}

void pere(int *tube)
{
char buffer[TAILLE_BUF] = "\0";
int lu;

close(tube[0]);



/* Tant que le pere peut lire sur l'entr§Ûe standard */
while( (lu = read(1, buffer, TAILLE_BUF)) > 0)
{

write(tube[1], buffer, lu);
}

close(tube[1]);
puts("Fin du traitement par le processus pere");
}


int main(int argc, char **argv)
{
int tube[2];


if(pipe(tube) == -1)
{
perror("pipe");
exit(1);
}

switch(fork())
{
case -1:
/* code en cas d'erreur */
perror("fork"); exit(1);
case 0:
/* Appel du traitement associe au fils */
fils(tube);

exit(0);
default:
/* Appel du traitement associe au pere */
pere(tube);

/* Le pere attend son fils avant de mourir */
wait(NULL);
}

return 0;
}
0
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 16:11
re,

sujet exacte : Gerer les redirections > et >> de la sortie erreur


J-Ph
0

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

Posez votre question
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 16:22
oui pas de soucis, c'est ça le sujet :

5éme sujet (le mien) : Gerer les redirections 2> et 2>> de la sortie erreur sous linux!!!


J-Ph
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 oct. 2010 à 16:24
Je ne comprends pas ta consigne.
J'ai une question qui pourrait m'éclairer:
Est-ce que ton exercice final consiste à recoder un shell ?

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 16:35
Beh en fait, le prof nous a fait un programme de base et on doit le modifier. Ce programme est en langage C. Il faut gérer la redirection simple > et double >> ainsi que les messages d'erreurs.

Je te passe le code du prof, je pense que tu verras mieux.





* exemple de creation et de transformation de processus */
/* REMARQUE IMPORTANTE :
Tous les echanges entre les differents processus se font en tenant
compte que le caractere '\n' termine toujours les messages */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include
#include <ctype.h>
#include <string.h>

#include "tools.h"

#define LBUF 512
char buf[LBUF];
void trace(char * M)
{
printf("PID=%d PPID=%d : %s\n", getpid(), getppid(), M);
}

int main(int N, char *P[])
{
int pid1, pid2, p1[2], p2[2], p3[2], i, n;
/* creation des 3 pipes */
if (pipe(p1) == -1) perror("pipe no1");
if (pipe(p2) == -1) perror("pipe no2");
if (pipe(p3) == -1) perror("pipe no3");
#ifdef DEBUG
trace("Je suis le programme de depart !!");
#endif
if ((pid1 fork()) -1) { /* creation du 1er fils */
perror("Creation du fils no1");
exit(1);
}
if (pid1 == 0) { /* je suis dans le fils no 1 */
#ifdef DEBUG
trace("Je suis le fils no 1 !!");
#endif
/* le fils no 1 n'utilise que sortie de p1 et entree de p2 */
close(p1[1]);
close(p2[0]);
close(p3[0]);
close(p3[1]);
/* recuperation du message de mon pere */
if ((n=lireLigne(p1[0],buf,LBUF)) == -1) {
perror("Fils 1 - rien recu du pere !!");
exit(3);
}
for (i=0; i<n; i++)
if (islower((int)buf[i])) buf[i] = (char)toupper((int)buf[i]);
#ifdef DEBUG
printf("Fils 1 - resultat : <%s>\n", buf);
#endif
/* envoi du travail au fils no 2 */
write(p2[1],buf,n);
exit(0);
} else { /* je suis dans le pere */
#ifdef DEBUG
trace("Je suis le pere apres creation du 1er fils !!");
#endif
if ((pid2 fork()) -1) { /* creation du 2eme fils */
perror("Creation du fils no2");
exit(2);
}
if (pid2 == 0) { /* je suis dans le fils no 2 */
#ifdef DEBUG
trace("Je suis le fils no 2 !!");
#endif
/* le fils no 2 n'utilise que sortie de p2 et entree de p3 */
close(p2[1]);
close(p3[0]);
close(p1[0]);
close(p1[1]);
/* ce fils va se transformer pour executer le code de md5sum
qui, par defaut, lit les donnees sur stdin (0) et ecrit le resiltat
sur stdout (1). Donc on dupplique les pipes pour que cela coincide !
******************/
dup2(p2[0],0); /* redirection de la sortie de p2 vers stdin */
dup2(p3[1],1); /* redirection de l'entree de p3 vers stdout */
close(p2[0]);
close(p3[1]);
/* transformation du fils 2 pour executer le code de md5sum */
execlp("md5sum", "fils2", "-");
perror("execlp");
exit(4);
} else { /* je suis dans le pere */
#ifdef DEBUG
trace("Je suis le pere apres creation du 2eme fils !!");
#endif
/* le pere n'utilise que sortie de p3 et entree de p1 */
close(p3[1]);
close(p1[0]);
close(p2[0]);
close(p2[1]);
/* envoyer une phrase a mon fils no1 */
sprintf(buf,"Boujour tout le monde de l'Insia !!\n");
write(p1[1],buf, strlen(buf));
/* attend la reponse du fils no 2 */
if ((n= lireLigne(p3[0], buf, LBUF)) > 0) { /* resultat recu */
printf("Resultat : <%s> !\n",buf);
} else { /* rien recu */
printf("Je n'ai rien recu !!\n");
}
}
}
trace("Fin du programme");
return(0);
}

SOn fichier Tool :

/* Ma boite a outils qui complete les librairies standards */
#include
#include <string.h>

int lireLigne(int fd, char *b, int nc)
/* fd = file descriptor
b = adresse du buffer
nc = nb de caracteres possible (longueur du buffer */
{
char *d, *f;
d = b;
f = b+nc;
while(d<f) {
if (read(fd,d,1) != 1) break;
if (*d == '\n') break;
d++;
}
if (d == f) { /* cas du buffer trop petit */
d=b;
while (*d != '\n') read(fd,d,1);
return(-1);
}
*d = '\0';
return(strlen(b));
}







J-Ph
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 oct. 2010 à 16:41
Bon, pour gérer des redirections, pas le choix, il faut utiliser open (pas fopen !) afin de récupérer un file descriptor, et le dérouter.
Si tu veux dérouter un texte entré sur la sortie standard vers un fichier, alors il faut dérouter les "file descriptors".

Tu peux faire cela avec dup et dup2 (c'est dup2 qui va te servir):

http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/dup2.2.html
http://www.siteduzero.com/forum-83-486747-p1-probleme-avec-dup-et-dup2.html

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous