• STATISTIQUES
  • Il y a eu un total de 3 membres et 300 visiteurs sur le site dans les dernières 24h pour un total de 303 personnes!


    Membres: 1 814
    Discussions: 3 545
    Messages: 32 705
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Gekko
    Site de challenge présenter sous la forme d'une quête. Vous êtes un agent secret qui répond sous le nom...
    Challenges
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accéd...
    Challenges
    [EN] Big-Daddy
    Big-Daddy est site internet communautaire avec un effectif diversifié, y compris des artistes, des programmeur...
    Hacking
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges
    [EN] Exploit-db
    Une base de données d'exploits triés par genre (GHDB, Remote, Local, Web, DOS, ShellCode) à ...
    Vulnérabilités
    [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [EN] phrack
    Lot's of stuff !
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




[C] Initiation aux threads!

Bonjour.


0001: Introduction

Je suis en pleine "formation"/"amélioration de compétences" en C et j'ai pour habitude de partager ce que j'apprend. Voici pouquoi je vais vous parler des threads. Dans un premier temps, nous serons sur une utilisation standard des threads. C'est à dire la création de threads et leur exécutions. Dans un prochain tutoriel (si je l'écris bien sûr) je vous montrerai comment passer plusieurs arguments à un thread. En effet dans ce tutoriel nous en passerons qu'un seul car "techniquement" dans la déclaration de thread il n'est possible que d'en passer un.
Vous verrez qu'il n'y a rien de compliquer, et que la logique est plus de rigueur qu'autre chose. Je tiens à préciser que je suis un utilisateur Linux et que les tests, codes et lignes de commandes serons propres à ce système. Pour les personnes utilisant des systèmes différents, peux-être que certaines fonctions/options ne fonctionneront pas.

Aller c'est tipar! Wink

0010: bibliothèque/include

Afin de pouvoir utiliser les threads il vous suffira de mettre en include pthread.h.
Code C :

#include <pthread.h>
 


Il vous sera aussi nécessaire de rajouter -lpthread dans la ligne de commande gcc.
Code C :

gcc -o main -o main.c -lpthread
 


0011: Les fonctions de pthread.

La fonction pour créer les threads:
Code C :

int pthread_create (pthread_t * thread, pthread_attr_t * attr, void * (* start_routine) (void *), void * arg);
 


Sous linux, celle-ci renverra un int de type unsigned.

Un peu d'explications:
pthread_t thread: Ici c'est le nom de votre thread que l'on verra un peu plus tard, déclaré.
pthread_attr_t * attr: Ici c'est pour changer le comportement du thread. Je ne l'ai jamais utilisé pour être franc. Nous mettrons donc l'attribut NULL
void * (* start_routine) (void *): Ici c'est le nom de la fonction à executer. Il est bien sûr complètement possible d'avoir 2 threads qui tournent avec la même fonction. D'ailleurs nous le verrons car c'est que je vais vous montrer en dessous.
void * arg: L'arguments passé à notre fonction lancé par le thread... Nous ne pouvons en mettre qu'un seul. Pas possible d'en rajouter. Si vous désirez passer plusieurs arguments à un thread, il vous faudrat passer par les structures.

Fonction pour fermer un thread:
Code C :

void pthread_exit (void * valeur);
 


void * valeur:Argument récupéré par phtread_join()

Fonction pour cancel le thread

Code C :

int pthread_cancel (pthread_t thread);
 


pthread_t thread: Nom du thread à cancel.
A utiliser en faisant trés ATTENTION. En effet comme son nom l'indique, cette fonction permet d'exit un thread.

Exclamation Dans le cas où vous utiliseriez les threads lock afin d'utiliser des ressources partagées entre threads (zone critique) et que vous killez le thread avant d'avoir unlock la ressource, celle-ci ne sera plus disponible pour les autres threads. Je n'aborderai pas ce sujet ici car il est à lui tout seul un tutoriel.

Fonction pthread_join

Code C :

int pthread_join (pthread_t thread, void ** valeur);
 


Cette fonction est trés utile. Elle permet de "forcer" l'execution complète du thread avant la fin du programme. En effet imaginons que dans un thread nous avons un gros traitement a faire, le programme pourrait se finir avant l'exécution total du thread se qui pourrai être ennuyeux. Avec cette fonction, plus de souci.

pthread_t thread: Nom du thread
void ** valeur: Valeur de retour du thread.

Je n'ai pas mis toutes les fonctions. Pour plus d'informations, je vous invite à regarder cette page Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici..

0100: La pratique

Donc comme on peut le deviner, nous allons réaliser un programme qui met en place 3 threads.
Rien de bien compliqué, il n'affichera qu'un int, avec leur numéro de threads.

Voici le code
Code C :

#include <pthread.h>
#include <stdio.h>  // printf()
#include <string.h> // strlen()
#include <unistd.h> // usleep()

/* Les sleep() sont seulement ici pour affiner l'affichage*/
void affichage(int *arguments){
    int i;

    for(i=0; i<5; i++){
        printf("Thread%d: %d\n", *arguments, i);
        sleep(3);
    }
}


int main(int argc, char* argv[]){
    /* Ici on déclare nos threads:*/
    pthread_t thread1;
    pthread_t thread2;
    pthread_t thread3;

    /* Nos threads afficherons un int et leur numéro de thread*/
    int nb1 = 1;
    int nb2 = 2;
    int nb3 = 3;
   
    /* Ici nous allons créer nos thread a l'aide de pthread_create()*/
    pthread_create(&thread1, NULL, (void *)affichage, &nb1);
    sleep(1);
    pthread_create(&thread2, NULL, (void *)affichage, &nb2);
    sleep(1);
    pthread_create(&thread3, NULL, (void *)affichage, &nb3);

    /* ON attend que nos threads soient terminés avant la fin du programme*/
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);

    return 0;
}

 


Et on le compile de cette manière:
Code C :

gcc -o thread thread.c -lpthread
 


Et voici la sortie:

Code C :

shut@M1nT ~/scripts/C $ ./thread
Thread1: 0
Thread2: 0
Thread3: 0
Thread1: 1
Thread2: 1
Thread3: 1
Thread1: 2
Thread2: 2
Thread3: 2
Thread1: 3
Thread2: 3
Thread3: 3
Thread1: 4
Thread2: 4
Thread3: 4
shut@M1nT ~/scripts/C $
 


Je ne rajouterai pas de commentaire sur le code, car j'en ai mis a l'intérieur de celui-ci. Pour une meilleure lecture en couleur de celui-ci, ca se passe Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici..

Voilà j'espère avoir éclairé nos jeunes membres (jeune pas pour l'age mais pour les compétences en C).

0101 Conclusion.

Les threads sont trés utiles lorsque nous désirons réaliser des taches en parallèles, et vous serez forcément un moment ou a un autre obligé de les utiliser, donc autant le faire le plus tôt possible afin de pouvoir affronter la situation correctement lors de l'implémentation de threads dans des programmes plus complexes.

Je suis loin d'être UBER skilled (<= kikoulolz language Smile ) en C, mais je trouve que ce language est vraiment bien. On reste sur un language puissant et très peu limité. Je connaissais celui-ci depuis des années, mais a part quelques "hello world!" je ne l'avais jamais utilisé réellement jusqu'à récement. Et now je dois en faire a peu près 7 a 8 heures par jour. Smile
Même si cela pourrai être un autre débat, je pense que toutes personnes pratiquant le hacking (toutes sortes confondu) devrait réellement avoir des bases+++.

Bref en espérant que ceci vous aura aidé (pour ceux qui ne connaissent of course. Smile )

Junky.

New Project News White Hat Hacker V2.3
Accueil | Challenges | Tutoriels | Téléchargements | Forum