1

Plop all,
J'ai un petit problème qui m'embête depuis quelques jours ^^
Voici la situation :
J'ai un programme A qui appelle fork (), le père attend le fils (normal) et dans le fils, je charge dynamiquement une bibliothèque (par exemple libfoo.so) qui va appeler à son tour des fonctions se trouvant dans la bibliothèque libsystem.so, dans un ordre que je ne maitrise pas i.e ce n'est pas moi qui a codé ce qu'il y a dans libfoo.so
Dans libsystem.so, j'ai une variable board déclarée en dehors de toute fonction (oui, variable globale) et déclarée static (si je ne me trompe pas, cela veut bien dire qu'elle gardera sa valeur jusqu'à la fin du programme ?) : static TILE board[16][16]. Les fonctions appelées à partir de libfoo.so (qui sont dans libsystem.so) vont modifier cette variable board, jusque là aucun souci.
Aucun souci non plus à la compilation, le code du programme A est compilé avec la bibliothèque libsystem.so, et tout fonctionne bien.
Maintenant le souci : pour terminer de façon brutale le fils (c'est pour éviter de tricher, un appel à une fonction à partir de libfoo.so termine son tour et le programme A reprend la main ensuite pour le tour de l'autre joueur) j'utilise "exit 0", mais je me rends compte que les modifications faites ne sont pas prises en compte, le board n'a pas changé lorsque je reviens dans le programme A sad
Lorsque j'enlève le "exit 0" tout marche bien, mais du coup libfoo.so peut tricher : faire semblant de terminer son tour, jouer à la place de l'autre puis reprendre la main et c'est pas terrible
Quelqu'un a t-il donc une idée ? ou une meilleure façon pour éviter cela ? Il faut éviter que "l'intermédiaire" libfoo.so ait accès à des données "système"...
Merci smile

EDIT : hm, en fait je viens de voir que fork crée un nouveau process, c'est donc logique que la variable board n'est pas modifiée puisque c'est 2 process différents. Je vais me renseigner sur la communication inter-process ...
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

2

pour de l'interprocess tu peux utiliser des pipes, ou des sockets unix, ou bien des shmem (shared memory) mais je connais pas.

si tu veux pouvoir exécuter des routines en parallèles tout en partageant les données, il te faut deux threads avec pthread.h et pthread_create, plutot que fork qui effectivement duplique les processus en faisant des copies des variables, mais ne partagent plus rien niveau mémoire et évoluent indépendamment (on fait juste une duplication de l'état au moment du fork() )

dans ce cas il faut penser a protéger les accès concurrents par des mutex/sémaphores.

3

(cross)
tama (./1) :
EDIT : hm, en fait je viens de voir que fork crée un nouveau process, c'est donc logique que la variable board n'est pas modifiée puisque c'est 2 process différents. Je vais me renseigner sur la communication inter-process ...
Pourquoi ne pas faire des threads dans ce cas là ? (j'avoue ne pas avoir vraiment lu le reste)

4

Ok, c'est bon merci Pen^2, effectivement avec les threads ça marche mieux, je les avais pas utilisés parce qu'il me manquait la fonction pthread_exit () pour terminer le thread smile
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

5

6

(C'est surtout squalyl qu'il faut remercier hehe)

7

@squalyl : je l'avais pas remarquée, et merci aussi smile
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

8

Bon, je profite de ce thread pour faire une petite pub pour le "produit fini", c'est un combat d'intelligences artificielles sur un jeu simple que j'ai appelé "punto"
Le principe du jeu est de gagner le plus de points possibles en plaçant de façon optimale ses pions et ses bonus/malus sur le terrain
Toutes les fonctions nécessaires ont déjà été codées ((re)merci à Squalyl/Pen^2 au passage) et peu de connaissances C/C++ sont nécessaires pour pouvoir jouer
Je sais que vous êtes tous occupés et que vous avez autre chose à faire, mais ça peut toujours intéresser 1 ou 2 personnes qui passent par ici et qui verraient ce sujet

En tout cas, je suis ouvert à toutes suggestions/critiques (vous avez le droit de dire que c'est nul à chier, mais expliquez pourquoi !) pour améliorer le système de jeu
Le site officiel se trouve ici : http://tamaweb.monsite.tk/punto

Voilà voilà smile
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic