Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/05/2007, 11h49   #1
Membre du Club
 
Inscription : mai 2007
Messages : 84
Détails du profil
Informations personnelles :
Âge : 24

Informations forums :
Inscription : mai 2007
Messages : 84
Points : 68
Points : 68
Par défaut Redirection entrée standard avant EXEC

Bonjour,


je suis nouveau sur ce forum, je le connais depuis assez longtemps mais je ne sais pas si j'ai posté mon message au bon endroit désolé si ce n'est pas le cas.

Voici mon problème :

J'ai un programme prog qui lit sur le fichier standard d'entrée, numdescripteur 0,un nom (que l'utilisateur tape sur le clavier) puis il l'affiche sur l'écran donc numdescripteur 1.

J'ai un deuxième programme qui créer un fils via fork() puis le fils doit exécuter "prog" en redirigeant son entrée vers un fichier "Donnees.txt" (par exemple) puis sa sortie vers un autre fichier "Resultat.txt" (par exemple).

Donc plus clairement :

Le pere créer un fils, le fils redirige les fichiers standard d'entrée et sortie du prog qui l'éxécute via execlp.

J'ai deja fait un le programme :

Contenu du prog.C

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
int main(){
 
    char nom[40];
    int nbOcLus;    
 
    write(0,"Votre nom ?\n",13);
    nbOcLus=read(0,&nom,40);
 
    //écriture du nom qu'on a lu sur le clavier
    write(0,"Bonjour \n",10);
    write(0,&nom,nbOcLus);
 
    exit (0);
}
voici le code du programme qui créer le fils et qui doit rediriger les entrées / sorties du prog

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include <sys/wait.h>
 
void mess(char*,int);
 
int main(){
 
pid_t idp;
int nbOctLus,numDesc,numIn;
char buffer[50];
 
numDesc=open("donnees.txt", O_RDONLY, 0644); //ouverture fichier
numIn=open("Resultat.txt", O_RDWR | O_CREAT | O_APPEND, 0644); //ouverture fichier résultat
 
if(numIn==-1){
    mess("Probleme ouverture fichier Resultat \n",2);
    exit(1);
    }
 
if(numDesc==-1){
    mess("Probleme ouverture fichier donnees \n",2);
    exit(1);
    }
 
idp=fork(); //création du fils
 
 
if(idp==-1) {
	mess("Probleme fork",2);
	exit(-1);
	}
 
if(idp==0){
 
        dup2(numDesc,0);
        close(numDesc);
        dup2(numIn,1);
       close(numIn);
	execlp("prog","prog",NULL);
 
	mess("probleme exec",2);
 
	exit(2);
	}
 
wait(NULL);
 
exit(0);
}
 
void mess(char *m,int numDescripteur){
    write(numDescripteur,m,strlen(m));
}

A l'éxécution je n'ai aucun message, je regarde le contenu de résultat.Txt : VIDE

Contenu de donnees : lol



voila j'espère que j'ai été assez clair pour que vous puissiez m'aider, merci d'avance


AllyKo
AllyKo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 06h59   #2
Membre éclairé
 
Avatar de Lunixinclar
 
Inscription : juillet 2006
Messages : 384
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 384
Points : 342
Points : 342
Envoyer un message via MSN à Lunixinclar
Salut et bienvenue,

Essayes avec execlp("./prog","prog",NULL); au lieu de execlp("prog","prog",NULL);

Sinon mets des printf un peu partout pour suivre l' état des variables et les codes de retour de toutes les fonctions. Tu repèreras vite ce qui coince.

PS: #include <iostream> est du C++ pas du C.
Lunixinclar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2007, 09h35   #3
Membre à l'essai
 
Inscription : avril 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 24
Points : 21
Points : 21
Ca semble le plus simple en effet...

Met un printf court (genre printf("1"); dans ton if(pid=-1) et a la place de tes dup2 + close et avant et apres ton wait.

Tu devrais pouvoir voir le souci assez facilement.

Quand tu mets du fork, ca devient vite un peu le souk pour voir d'ou viennent les problemes, le père et le fils pouvant écrire en meme temps sur le stdout, mais pour débugguer le mieux reste malgrè tout le printf en étant bien carré et avec des printf très courts.
liodev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h26.


 
 
 
 
Partenaires

Hébergement Web