Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment :
Coffret Pokémon Bundle 6 Boosters EV05 Forces ...
Voir le deal

Les semaphores

3 participants

Aller en bas

Les semaphores Empty Les semaphores

Message  tim Mar 15 Juil 2008 - 13:28

Bonjour,
Les sémaphores c'est le bien, il existe une tonne de références à ce sujet (cf. http://man.developpez.com/man3/sem_init.3thr.php).
Mais très peu d'exemples d'utilisations. Connaissez vous un quelconque exemple de code mettant en pratique cette base incontournable ?
Si le manuel est assez précis, sa mise en œuvre est une autre paire de manche.

merci d'avance.

tim

Messages : 8
Date d'inscription : 27/06/2008

http://www.adherun.com

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  -ed- Mer 16 Juil 2008 - 9:25

tim a écrit:Les sémaphores c'est le bien, il existe une tonne de références à ce sujet (cf. http://man.developpez.com/man3/sem_init.3thr.php).
Mais très peu d'exemples d'utilisations. Connaissez vous un quelconque exemple de code mettant en pratique cette base incontournable ?
Si le manuel est assez précis, sa mise en œuvre est une autre paire de manche.
Si tu parles des sémaphores des pthreads, j'ai donné quelques exemples ici :

http://mapage.noos.fr/emdel/pthreads.htm
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  tim Mer 16 Juil 2008 - 10:19

En fait je parlais des sémaphores dans son utilisation générale.
Par exemple dans le cas de l'accès d'une ressource quelconque entre différents processus. ( l'accès à la mémoire, pour être plus précis, une allocation dynamique via un malloc et sa libération par un free() ).
Dans mon cas, je me disais que ça aurait été bien de pouvoir gérer cette attribution de façon séquentielle ( j'ai remarqué que le fait de lancer plusieurs applications utilisant un malloc pouvait entrainer un conflit dans la mémoire).

Ce qui me fait peur dans le man du malloc :
Ceci signifie que lorsque malloc () renvoie une valeur non-NULL, il n'y a aucune garantie que la mémoire soit véritablement disponible. Dans le cas où le système manque de mémoire, un ou plusieurs processus seront tués par l'infâme exterminateur de gestion mémoire.
ça lui arrive de tuer mon application et comme elle tourne comme serveur, cela me tue mes clients aussi :) D'où un petit sémaphore pour contrôler tout ça :)

tim

Messages : 8
Date d'inscription : 27/06/2008

http://www.adherun.com

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  -ed- Mer 16 Juil 2008 - 13:28

tim a écrit:En fait je parlais des sémaphores dans son utilisation générale.
Par exemple dans le cas de l'accès d'une ressource quelconque entre différents processus.
Si il s'agit de différents processus, à ma connaissance, il n'y a pas de problèmes de concurrence liés à malloc(), car, selon le système, soit chaque processus gère son espace de mémoire allouée, soit il en gère déjà l'accès concurrent.
( j'ai remarqué que le fait de lancer plusieurs applications utilisant un malloc pouvait entrainer un conflit dans la mémoire).
Je pencherais pour un problème d'utilisation de la mémoire, mais pas de création. Quand au free(), il doit évidemment ne pas faire trop tôt. Montre le code qui a un problème.

Ce qui me fait peur dans le man du malloc :
Ceci signifie que lorsque malloc () renvoie une valeur non-NULL, il n'y a aucune garantie que la mémoire soit véritablement disponible. Dans le cas où le système manque de mémoire, un ou plusieurs processus seront tués par l'infâme exterminateur de gestion mémoire.
ça lui arrive de tuer mon application et comme elle tourne comme serveur, cela me tue mes clients aussi :) D'où un petit sémaphore pour contrôler tout ça :)
Tu parles probablement de GNU/Linux. Oui, ce problème est connu. Tant que la mémoire allouée n'a pas été utilisée, elle n'est pas véritablement allouée. Ca se règle en faisant suivre l'allocation par un accès en écriture (initialisation, ce qui n'est pas rare dans un programme !). Ce n'est pas une parade absolue, mais généralement, ça fonctionne...

Plus de détails sur un forum spécialisé GNU/Linux. Le langage C ne décrit pas les mécanismes d'implémentation.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  tim Mer 16 Juil 2008 - 14:25

Merci pour ce début de réponse,

J'aurais du être plus précis. En fait, j'ai une application en C, qui fait office de serveur ( socket entre autre). Elle tourne actuellement sur ma machine, en test . Sur cette même machine, je décide de lancer de façon très rapprochée, plusieurs clients (en flash).

Un cas d'utilisation de ce client peut être, lorsqu'il se connecte , de récupérer la liste de toutes les personnes déjà présentes sur le serveur ( stockage dans un tableau ). Je fabrique donc une chaine de caractères dynamique ( voir mon post sur malloc), elle se présente sous la forme "lesConnectés=toto=titi=tutu=.." que j'envoie par un send() et que je libère avec un free().

Suite à ce rajout, lors de tests poussés, j'ai pu remarquer qu'il pouvait y avoir un conflit dans la gestion de la mémoire, je me suis dis que cela était peut être dû à la concurrence des processus sur la ressource critique que pouvait représenter le malloc.

J'ai pensé que l'utilisation de sémaphores pouvait être une solution afin de contrôler la chose.

tim

Messages : 8
Date d'inscription : 27/06/2008

http://www.adherun.com

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  -ed- Mer 16 Juil 2008 - 16:47

tim a écrit:J'aurais du être plus précis. En fait, j'ai une application en C, qui fait office de serveur ( socket entre autre). Elle tourne actuellement sur ma machine, en test . Sur cette même machine, je décide de lancer de façon très rapprochée, plusieurs clients (en flash).
Que signifie 'en flash' ?

Un cas d'utilisation de ce client peut être, lorsqu'il se connecte , de récupérer la liste de toutes les personnes déjà présentes sur le serveur ( stockage dans un tableau ). Je fabrique donc une chaine de caractères dynamique ( voir mon post sur malloc), elle se présente sous la forme "lesConnectés=toto=titi=tutu=.." que j'envoie par un send() et que je libère avec un free().
Pseudo-code :
Code:
char *s = malloc()
if (s != NULL)
{
  init(s)
  send(s)
  free (s);
Il n'y a aucun problème avec ça si les sockets sont bloquants (fonctionnement par défaut).


Suite à ce rajout, lors de tests poussés, j'ai pu remarquer qu'il pouvait y avoir un conflit dans la gestion de la mémoire, je me suis dis que cela était peut être dû à la concurrence des processus sur la ressource critique que pouvait représenter le malloc.
Je préfère mettre le code en cause, avant de dire que c'est le système ! Poste ton code, il est probablement buggé.
J'ai pensé que l'utilisation de sémaphores pouvait être une solution afin de contrôler la chose.
C'est peu probable. La système fait déjà ce qu'il faut.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  tim Jeu 17 Juil 2008 - 9:20

Il y a eu X versions et tentatives de codes pour cette partie, la solution ci-dessous est la seule qui puisse m'amener un semblant de solution.
En fait, elle marche (c'est l'essentiel), même après quelques tests poussés.
Code:
    rcvall = (char*)malloc(n*sizeof(char*));
    if(rcvall!=NULL)
    {
        strcpy(rcvall,"listedesconnectes=");
        for (i2 = 0; i2 < n; i2++)
        {
            //Ici je change de client
            // blabla
            if (sock != INVALID_SOCKET)
            {
                    //realloc(rcvall,n*sizeof(rcvall)+strlen(rcvall)+2);
                    realloc(rcvall,n*sizeof(char*));
                    //J'avais une préférence pour la solution commentée
                    itoa(sock, psock, 10);
                    strcat(rcvall,psock);
                    strcat(rcvall,"/");
                    strcat(rcvall,pseudo);
                    strcat(rcvall,"=");
            }
            else
            {
                puts ("Socket non valide");
            }
        }
        send ();
        free(rcvall);
        rcvall=NULL;
    }

J'avoue abuser des largeurs du langage C, notamment avec le malloc (char*) et le realloc.

PS: J'entends par Flash, le fait d'avoir réalisé un petit client en flash, pour changer du telnet Shocked

tim

Messages : 8
Date d'inscription : 27/06/2008

http://www.adherun.com

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  -ed- Jeu 17 Juil 2008 - 10:04

tim a écrit:Il y a eu X versions et tentatives de codes pour cette partie, la solution ci-dessous est la seule qui puisse m'amener un semblant de solution.
En fait, elle marche (c'est l'essentiel), même après quelques tests poussés.
Code:
    rcvall = (char*)malloc(n*sizeof(char*));
  • Combien vaut n ?
  • A quoi sert le cast ?
  • Pourquoi sizeof (char*) ? Le cast est faux ?

Je rappelle la méthode canonique :
Code:
T *p = malloc(n * sizeof *p);
ce qui évite bien des âneries. Ici :
Code:

    char*    rcvall = malloc (n*sizeof *rcvall);
 
Code:
                    //realloc(rcvall,n*sizeof(rcvall)+strlen(rcvall)+2);
                    realloc(rcvall,n*sizeof(char*));
realloc() ne fonctionne pas du tout comme ça. A lire d'urgence :

http://mapage.noos.fr/emdel/notes.htm#realloc

et corriger le code en conséquence.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  flo Ven 18 Juil 2008 - 16:21

Il me semble que la fonction itoa n'est pas portable. Enfin c'est juste un petit détail dans l'application

flo
Bavard
Bavard

Messages : 11
Date d'inscription : 04/06/2008

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  -ed- Ven 18 Juil 2008 - 18:17

flo a écrit:Il me semble que la fonction itoa n'est pas portable.
Tout à fait.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Les semaphores Empty Re: Les semaphores

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser