begin process at 2012 05 28 11:53:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

GUI

 > 

Aide systeme


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Aide systeme

samedi 16 octobre 2010 à 15:20:42 | Aide systeme

jeanphilippe37

Membre Club
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
samedi 16 octobre 2010 à 17:20:18 | Re : Aide systeme

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 21 octobre 2010 à 16:10:30 | Re : Aide systeme

jeanphilippe37

Membre Club
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 :

Code C/C++ :

#include <stdio.h>
#include <wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#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;
}
jeudi 21 octobre 2010 à 16:11:51 | Re : Aide systeme

jeanphilippe37

Membre Club
re,

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


J-Ph
jeudi 21 octobre 2010 à 16:16:05 | Re : Aide systeme

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 21 octobre 2010 à 16:22:41 | Re : Aide systeme

jeanphilippe37

Membre Club
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
jeudi 21 octobre 2010 à 16:24:35 | Re : Aide systeme

CptPingu

Administrateur CodeS-SourceS
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 21 octobre 2010 à 16:35:36 | Re : Aide systeme

jeanphilippe37

Membre Club

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.

Code C/C++ :



* 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 <unistd.h>
#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 <unistd.h>
#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
jeudi 21 octobre 2010 à 16:41:50 | Re : Aide systeme

CptPingu

Administrateur CodeS-SourceS
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
Merci d'utiliser Réponse acceptée si un post répond à votre question


Cette discussion est classée dans : aide, systeme, linux, redirection, langage


Répondre à ce message

Sujets en rapport avec ce message

aide à la réalisation d'un projet sur linux [ par hafed120 ] le projet consiste à développer un algorthme optimale de recherches de signatures d'attaques dans unréseau:+comment utiliser conjointement un outil de Recherche Linux Mandrake et aide pour monter un reseau [ par mrwalm ] Salutation,j'ai besoin d'un maximun d'aide SVP, je doit monter absolument un reseau avec linux mendrake 9.1 pour lundi (c'est pour avoir un job) avec systeme de fichiers [ par samder76 ] Je ne sais pas si C le bon endroit pour demander de l'aide...Je dois réaliser un système de fichier sous Unix.-La gestion des fichiers doit se faire p [langage c] incrémentation d'une ip sous linux [ par azurone ] [alors voilà je reçoit une ip au format xxx.xxx.xxx.xxxdepuis un char*argc[]j'aimerais savoir comment l'incrémenterje souhaite faire un scanner de pla a l aide !!! [ par romigui ] est ce que quelqu un peu m aider ??? je m y connais pas du tout en programmation et je voudrais faire mes debuts , on m as dit qu il fallé d abord cho Ajout d'un périphérique sous Linux. [ par tex2023 ] Je travaille sous le systeme linux  Fedora Core1 et il ne veux pas detecter mon modem (externe: Askey 56k Data Fax Voice Modem PnP).Le noyau du system linux [ par rawen ] svp vou pouvez m'aider de faire un mini compilateur en langage lex/yacc pour qu'il puisse faire compiler 3 boucles en langage C -la boucle for -la bou la souris en langage c [ par kikaanouar ] slt je suis une etudiante dans une ecole d ingenieurie en informatique et je demande votre aide j ai un projet en langage c 'menu deroulant ' et je vx Besoin d'aide par Skype pour une deuxième sess de Langage C [ par Mgiv64 ] Bonjour à tous, Voila, j'ai une deuxième session en Langage C. J'aimerai poser quelques questions à travers Skype à un guru du langage C, je suis su A l'aide...création d'un programme compatible windows et linux [ par nicko666 ] Bonjour à tous,voila j'ai un gros problème, je suis débutant et je suis obligé de créer un programme C++ qui doit pouvoir tourner sur windows aussi bi


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales