IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Probleme de pipe et de process pere-fils sous Windows


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut Probleme de pipe et de process pere-fils sous Windows
    Bonjour a tous,

    Je vous solicite aujourd'hui car j'ai un gros probleme sous Windows.
    Ayant lu la doc msdna pendant un petit bout de temps cette nuit, je n'arrive pas a comprendre l'erreur d'un ReadFile qui plante sur un Handle d'une sortie de pipe.

    Desole pour les yeux je vous met le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    void		WExec::createChildProcess(HANDLE& wr_h)
    {
    	TCHAR cmd[]=TEXT("toto");
    	PROCESS_INFORMATION pi;
    	STARTUPINFO si;
    	BOOL bSuccess = FALSE;
     
    	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    	ZeroMemory(&si, sizeof(STARTUPINFO));
    	si.cb = sizeof(STARTUPINFO);
    	si.hStdError = stderr;
    	si.hStdOutput = wr_h;
    	si.hStdInput = stdin;
    	si.dwFlags |= STARTF_USESTDHANDLES;
     
    	if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
    		std::cout << "Creating Process Succeed" << std::endl;
    	else
    	{
    		std::cout << "Creating Process Failed" << std::endl;
    		CloseHandle(pi.hProcess);
    		CloseHandle(pi.hThread);
    	}
    }
     
    void		WExec::readPipe(HANDLE& rd_p, HANDLE& wr_c)
    {
    	LPDWORD dr = 0, dw = 0;
    	CHAR buf[BUFSIZE];	
    	BOOL flag = FALSE;
    	std::string	tmp;
     
    	HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    	ZeroMemory(&buf, BUFSIZE);
    	if (!CloseHandle(wr_c))
    		std::cout << "Closing Child HANDLE Failed" << std::endl;
    	else
    		std::cout << "Closing Child Handle succeed" << std::endl;
    	for (;;)
    	{
    		flag = ReadFile(rd_p, &buf, BUFSIZE, NULL, NULL);
    		std::cout << GetLastError() << std::endl;	
    		if (!flag || dr == 0)
    			break;
    		flag = WriteFile(out, buf, (DWORD)dr, dw, NULL);
    		if (!flag)
    			break;
    	}
    	CloseHandle(rd_p);
    }
     
    std::string&	WExec::execute(std::string& file, std::list<std::string> & param)
    {
    	SECURITY_ATTRIBUTES	sa;
    	HANDLE wr_child = NULL;
    	HANDLE rd_parent = NULL;
     
    	sa.bInheritHandle = TRUE;
    	sa.lpSecurityDescriptor = NULL;
    	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
     
    	if (CreatePipe(&rd_parent, &wr_child, &sa, 0) == 0)
    	{
    		std::cout << "Error creating first pipe" << std::endl;
    		return *(new std::string(""));
    	}
    	if (!SetHandleInformation(rd_parent, HANDLE_FLAG_INHERIT, 0))
    	{
    		std::cout << "Error in inheriting handle : " << GetLastError() << std::endl;
    		return *(new std::string(""));
    	}
     
    	this->createChildProcess(wr_child);
    	this->readPipe(rd_parent, wr_child);
    	return *(new std::string(""));
    }
    La problematique de ce code etant de creer un pipe, creer un processus fils, rediriger sa sortie standard sur l'entree du pipe, et execute une commande, pour recuperer la sortie du fils dans mon pere.

    La methode est appeller dans un main de test qui ne fait que l'appeller. Les paramettres sont mis pour faire jolie, les variables necessaire a l'execution sont toutes ici.

    Ce code plante au ReadFile present dans la methode readPipe. D'apres le debugger de Visual, c'est flush qui aurait un probleme avec un this a NULL.

    La magie de Windows fait aussi que suivant que je sois en Debug ou en Release mon buffer est rempli avant de planter.

    Je ne comprends absolument pas le bug, si quelqu'un avait ne serait ce qu'une piste, je suis preneur.

    Merci a ceux qui prendront le temps de m'aider.

    Cordialement.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    J'ai un probleme similaire, si jamais vous aviez une reponse

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je n'ai pas lu tout ton code, mais la ligne ReadFile est incorrecte, il me semble :
    Citation Envoyé par Ipone Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flag = ReadFile(rd_p, &buf, BUFSIZE, NULL, NULL);
    buf est un tableau de caractères donc déjà l'adresse vers le premier élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flag = ReadFile(rd_p, buf, BUFSIZE, NULL, NULL);

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je n'ai pas lu tout ton code, mais la ligne ReadFile est incorrecte, il me semble :

    buf est un tableau de caractères donc déjà l'adresse vers le premier élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flag = ReadFile(rd_p, buf, BUFSIZE, NULL, NULL);
    Merci pour la reponse mais je dois avouer que je n'en attendais plus, d'ou mon oubli de up sur le post. Le probleme est maintenant corrige depuis un petit bout de temps.

    Pour ta rectification Archi, elle n'est pas fausse cependant avec ou sans cela fonctionne pareil, a voir apres le type exact qu'attend readFile mais ca ne le derange pas plus que ca.

    L'erreur venait du NULL en 4eme parametre a ReadLine. La doc officiel microsoft precise que ce parametre est optionel, cependant il ne l'est PAS.
    ReadFile tente quand meme d'ecrire a l'adresse contenu par ce LPDWORD (pointeur sur unsigned long (DWORD)) ici NULL, d'ou mon plantage.

    Aaaaaaaaaaah Windows et ses types obscures

    Merci quand meme pour la reponse, en esperant que ce pave et ce post pourra aider ceux qui rencontreront le meme probleme.

Discussions similaires

  1. [Débutant] Runas et Process.Start(explorer) sous windows 7
    Par gnoupix dans le forum VB.NET
    Réponses: 0
    Dernier message: 27/12/2011, 09h59
  2. Réponses: 1
    Dernier message: 21/05/2009, 14h23
  3. probleme à la fin de l'installation de mysql sous windows
    Par s-ehtp dans le forum Installation
    Réponses: 2
    Dernier message: 09/03/2009, 22h25
  4. Probleme de comunication pere fils
    Par Flash_Over dans le forum Linux
    Réponses: 1
    Dernier message: 12/11/2007, 18h48
  5. [SQL server 2005] Problème de tris avec notion Père-Fils
    Par pedrover dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/12/2006, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo