[C] executer plusieurs boucles en meme temps

executer plusieurs boucles en meme temps [C] - C - Programmation

Marsh Posté le 03-03-2009 à 13:30:38    

Bonjour,
 
Je commence depuis quelques jours à m'interesser au C (dans un premier temps pour créer un petit daemon de backup à partir de mes scripts bash qui commencent à grossir sérieusement) et je me demandais s'il était possible d'executer 2 boucles (voir +) au même instant. Et si oui comment, bien sûr. J'ai appris rapidement quelques bases du langage mais j'ai rien trouvé la dessus.
Et pendant que j'y suis, j'ai vu plusieurs manières de stocker une chaine de charactère dans une variable. Celle que j'utilise est char nomdemavariable[] = "ma chaine de charactere"; .. est-ce correct ?
 
Merci :jap:

Reply

Marsh Posté le 03-03-2009 à 13:30:38   

Reply

Marsh Posté le 03-03-2009 à 13:47:06    

plusieurs boucle en meme temps => multi threading soit avec pthread soit avec openMP.

Reply

Marsh Posté le 03-03-2009 à 19:02:07    

En fait je m'explique :
 
J'ai mes instructions de backup dans une boucle infinie, et j'aimerais que, par exemple, toutes les x minutes le programme upload les données sauvegardées via ftp - pour l'instant je fais ça avec la fonction system("ftp..." );  :whistle: -. Jusqu'ici sur mon script bash je faisais ça avec un simple if dans cette même boucle.
 
Seulement le même problème se pose ici avec le C : je voudrais que lorsque les données sont en cours d'upload, ma boucle continue de tourner (que le backup continue et que ne soit pas bloqué jusqu'à la fin de l'execution de ftp).
D'où mon idée première de faire 2 boucles qui tournent en même temps : une boucle pour le backup et une boucle pour l'upload.
 
Suis-je clair ? Une idée ? :D

Reply

Marsh Posté le 03-03-2009 à 19:27:55    

fork() et exec non?
 
Ca ne marche peut-être que sous linux en fait...
Pour windows je te renvoie à la réponse de Joel.
 
Pour les chaines, oui ca fonctionne mais seulement à l'initialisation du tableau. Sinon il y a strcpy et strncpy (attention y'a des pièges) et d'autres fonctions du genre. man string je crois pour avoir tous les details.

Message cité 1 fois
Message édité par ptitchep le 03-03-2009 à 19:36:45

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 03-03-2009 à 19:55:52    

Exact en cherchant un peu je suis tombé sur fork (j'utilise jamais windows, seulement osx et debian), je vais regarder ça de plus près. Ca crée un second process, dommage mais bon.


Message édité par san_ le 03-03-2009 à 19:56:05
Reply

Marsh Posté le 03-03-2009 à 20:34:17    

enfin fork c'est genre standard voire POSIX [:dawa]

Reply

Marsh Posté le 03-03-2009 à 20:37:24    

Il y a un fork pour windows?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 03-03-2009 à 22:35:49    

j'ai compris de travers je croyé que c'etait l'inverse.
bah sous windows , CreateProcessEx et/ou WinThread.
 
On serait en C++ j'aurais dit boost::asio, boost::interprocess et boost::thread.

Reply

Marsh Posté le 05-03-2009 à 17:13:58    

bon finalement j'ai trouvé mon bonheur avec pthread

Code :
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. static void *task_a (void *p_data)
  4. {
  5.    puts ("Hello world A" );
  6.    (void) p_data;
  7.    return NULL;
  8. }
  9. static void *task_b (void *p_data)
  10. {
  11.    puts ("Hello world B" );
  12.    (void) p_data;
  13.    return NULL;
  14. }
  15. int main (void)
  16. {
  17.    pthread_t ta;
  18.    pthread_t tb;
  19.    puts ("main init" );
  20.    pthread_create (&ta, NULL, task_a, NULL);
  21.    pthread_create (&tb, NULL, task_b, NULL);
  22. #if 1
  23.    pthread_join (ta, NULL);
  24.    pthread_join (tb, NULL);
  25. #endif
  26.    puts ("main end" );
  27.    return 0;
  28. }

(exemple qui m'a bien aidé que j'ai trouvé ici)
par contre je ne comprend pas trop à quoi servent void *p_data et le (void) p_data; ici [:transparency]

Reply

Marsh Posté le 05-03-2009 à 17:50:23    

san_ a écrit :

bon finalement j'ai trouvé mon bonheur avec pthread
(exemple qui m'a bien aidé que j'ai trouvé ici)
par contre je ne comprend pas trop à quoi servent void *p_data et le (void) p_data; ici [:transparency]


Il m'avait bien semblé reconnaitre ce code !
 
Les tâches ont obligatoirement un paramètre permettant de traiter des données. Ici, on ne l'utilise pas. Le (void) p_data; permet de dire au compilateur "OK, je n'utilise pas le paramètre, arrête de m'envoyer des avertissements"...
 
Détails d'usage de ce paramètre ici :  
 
http://mapage.noos.fr/emdel/pthreads.htm#donnees


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2009 à 17:50:23   

Reply

Marsh Posté le 05-03-2009 à 19:16:24    

Moi ce que je ne comprends pas c'est  

Code :
  1. #if 1


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-03-2009 à 19:20:10    

ptitchep a écrit :

Moi ce que je ne comprends pas c'est

Code :
  1. #if 1



Ca vient de mon tutoriel sur pthread.

 

C'est du C de base (préprocesseur) :

 

#if 0 : le code n'est pas compilé,
#if 1 : le code est compilé.

 

Ça permet de [dé]commenter rapidement du code. Ici, c'était pour montrer l'effet de pthread_join() ...
 


Message édité par Emmanuel Delahaye le 05-03-2009 à 19:21:30

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2009 à 19:22:19    

C'est l'usage que je voulais savoir pas la signification lol
Merci quand même ;)
Je n'y avais jamais pensé moi j'utilise le menu comment/uncomment de mon IDE favori.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-03-2009 à 19:23:23    

ptitchep a écrit :

C'est l'usage que je voulais savoir pas la signification lol
Merci quand même ;)
Je n'y avais jamais pensé moi j'utilise le menu comment/uncomment de mon IDE favori.


Pas portable ...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2009 à 19:24:52    

Mon IDE est portable  :D  
Ok j'ai tord je retiens la technique.


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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