traitement d'erreur avec popen()

traitement d'erreur avec popen() - C - Programmation

Marsh Posté le 15-10-2008 à 17:59:05    

Bonjour, je fais un traitement dans extraire à l'aide de popen() qui execute lynx :

Code :
  1. char *extraire(const char* lien)
  2. {
  3.   FILE* flux = popen(lien,"r" );
  4. ...
  5. }
  6. ...
  7. valeur=extraire("lynx -dump  url_site" );
  8. ...


Le problème c'est que des fois la connexion au site echoue et tous ce code est dans un fork().
Comment puis je modifier le programme de sorte que si la connexion echoue avec l'url1 on passe à l'url2 ?

Reply

Marsh Posté le 15-10-2008 à 17:59:05   

Reply

Marsh Posté le 15-10-2008 à 18:17:12    

On fait "man popen", et on constate que c'est sur le pclose() qu'on peut détecter que le programme s'est terminé anormalement.

Reply

Marsh Posté le 15-10-2008 à 18:36:09    

matafan a écrit :

On fait "man popen", et on constate que c'est sur le pclose() qu'on peut détecter que le programme s'est terminé anormalement.


 
Je fais :

Code :
  1. if (pclose(flux)==-1)
  2.       {
  3.          trace_message("Echec connexion" );
  4.       }


Je n'ai pas de message d'erreur "Echec connexion" alors que l'url est faux mais sur l'écran l'erreur suivant -->lynx : accès impossible au fichier de départ url_bidon<-- se défile!

Reply

Marsh Posté le 15-10-2008 à 18:52:05    

Hmm, si la fonction pclose() n'est pas aussi pourrie que sa man page, tu devrais plutôt faire un truc du genre :
 

Code :
  1. int ret = pclose(flux)
  2. if (ret < 0 || (WIFEXITED(ret) && WEXITSTATUS(ret) > 0))
  3. {
  4.     trace_message("Echec connexion" );
  5. }


Bon, maintenant si lynx renvoie 0 en cas d'URL invalide, bah, utilise un autre programme pour tester l'URL.

Reply

Marsh Posté le 15-10-2008 à 19:14:36    

Non c'est ça qu'il faut faire :

Code :
  1. int rc = pclose(flux);
  2. if ((rc != -1) && WIFEXITED(rc) && WEXITSTATUS(rc)) {
  3.         fputs("Echec connexion", stderr);
  4. }


Message édité par matafan le 15-10-2008 à 19:15:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed