[C/C++] Faire marcher pipe et fork conjointement ?

Faire marcher pipe et fork conjointement ? [C/C++] - C++ - Programmation

Marsh Posté le 30-03-2003 à 16:32:11    

voila, j'arrive pas à saisir comment faire marcher pipe avec fork :/
 
mon but est d'éxécuter un prog, attendre ke ce prog ai fini pour reprendre la main et surtout, récupérer la sortie standard du prog lancé !
 
j'ai essaye popen, ça marche bien :) mais ça bouffe trop de ressource cpu :( (j'ai besoin de faire cela très régulièrement)


Message édité par Deadog le 30-03-2003 à 16:32:33
Reply

Marsh Posté le 30-03-2003 à 16:32:11   

Reply

Marsh Posté le 30-03-2003 à 18:09:51    

1 : tu fais un dup de stdout (1).
2 : tu le ferme
3 : tu ouvres le pipe (les premiers descripteurs de fichiers libres sont utilisés).
4 : tu forke.
4.1 (dans le fork) tu fais un gros exec
4.2 (dans le pere) tu lis dans le pipe.
 
de mémoire.

Reply

Marsh Posté le 30-03-2003 à 18:23:33    

oki, j'vais essayer :)
 
mici :jap:

Reply

Marsh Posté le 30-03-2003 à 18:42:30    

man 3 popen fais tous ça pour toi et surement

Reply

Marsh Posté le 30-03-2003 à 18:43:51    

deadog a écrit :


j'ai essaye popen

Reply

Marsh Posté le 30-03-2003 à 18:53:23    

ben c'est pour ça que je conseille le man, par ce que je vois pas pourquoi ça boufferai plus de ressources. popen n'a rien de magique, c'est un mix de toutes les fonctions décrites
 
et je vois pas ce que ca veut dire bouffer des ressources. j'en utilise tous le temps et le temps d'exécution et de récupération est tout à fait minime. les ralentissement que tu observes viennent  de l'executable que tu lance, pas de popen

Reply

Marsh Posté le 30-03-2003 à 18:57:06    

popen utilise sh en plus
 
et je veux essayé si par moi même c plus rapide ou pas
 
kan à l'utilisation de ressource je le vois bien !! j'ai essayé sans popen (sans faire d'opération du tout à ce niveau la) et l'utilisatoin cpu a fortement baissé (faut dire ke ça fait des "boucle" sur le popen)

Reply

Marsh Posté le 30-03-2003 à 19:04:50    

si tu le dis [:spamafote]  :heink:

Reply

Marsh Posté le 31-03-2003 à 22:16:56    

bon, j'ai réussi :)
 
mici lorill, mais ce ke tu m'a donner était pas dans le bon sens :D m'enfin, j'ai pu chercher kan même :)
 
j'ai fait :
1-ouvrir le pipe
2-fork
3.fils-fermer stdout
4.fils-dup de stdout
3.père-attendre :D
4.père-lire
 
 
voila ce ke j'ai fait :
 

Code :
  1. if(pipe(fd) < 0) return 0;
  2.   switch (fork()) {
  3.    case -1:
  4.     return 0;
  5.    break;
  6.    case 0:
  7.     if(close(1) < 0) return 0;
  8.     if(dup(fd[1]) < 0) return 0;
  9.     execlp("uname", "uname", "-n", NULL);
  10.    break;
  11.    default:
  12.     wait(NULL);
  13.     while (read(fd[0], buf, BUFSIZ)  != 0 && fd[0]) {
  14.       ...
  15.     }
  16.   }

 
 
 
le gain est faible, mais non négligeable puisque dans mes test j'en fais moins ke lors de son utilisation réel :)
ça m'a permit de passer de 20% d'utilisation cpu à 9-10 % ^^ (en faite, ct surtout enchainé les pipe dans le popen ki bouffer ! (avec les grep, cut, etc ...))


Message édité par Deadog le 31-03-2003 à 22:20:05
Reply

Marsh Posté le 31-03-2003 à 22:19:46    

j'ai oublié :
 
est-ce ke j'ai besoin de "rebrancher" le stdout après pour retrouver une utilisation normal ?

Reply

Sujets relatifs:

Leave a Replay

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