Envoyé par
loopiote
Merci pour cette réponse.
Je ne suis malheureusement pas encore débloquée. Je sais maintenant que c'est possible. Bien.
Oui, en fait, j'ai compliqué pour rien puisque dans le cas de processus père et fils, les codes sont identiques au moment de la mytose. Enfin, si c'est bien fork() que tu utilises.
J'ai un fichier arbitre.c où sont crées des processus fils. Leur code a eux est placé dans un autre fichier joueur.c
Toute la question est : comment crées-tu tes processus fils ? Si c'est avec fork(), ça passe. Si c'est avec exec() sur un fichier exécutable, alors il s'agit de deux processus qui n'ont absolument rien à voir entre eux, à part un lien de filiation qui fera que le fils mourra avec son père, à moins de s'émanciper entre temps.
Mon arbitre dit au début : signal(SIGINT, handler) puis fait un kill(<fils>,SIGINT)
Je met la fonction handler dans joueur.c
Ensuite pour lier les deux c'est la galère... J'ai essayé de faire un joueur.h puis de faire un include dans arbitre.c, mais (est-ce à cause de mon makefile?) la fonction handler n'est pas reconnue par l'arbitre :
(.text+0x4a): undefined reference to handler
Oui. C'est du C élémentaire. Ton fichier « *.h » va contenir les prototypes des fonctions, et éventuellement les variables déclarées dans d'autres fichiers mais visibles par un code donné, avec « extern ». Ce fichier définit les interfaces, c'est-à-dire les manières d'utiliser ces fonctions. Ceci va permettre de compiler un code en laissant des « blancs » qui seront comblés à l'édition des liens.
Tu peux comparer cela à la fabrication d'un avion : l'appareil entier est généralement conçu et fabriqué par un même atelier, sauf le moteur qui, lui, est produit par un motoriste spécialisé. Celui-ci va quand même te filer les spécifications dans un petit cahier (ici, ton *.h) qui va te permettre de prévoir les trous, les commandes, l'arrivée d'essence, etc. aux bons endroits même si tu ne dispose pas encore du moteur. Ensuite, quand les deux parties sortent de leurs usines respectives, il n'y a plus qu'à les assembler pour que ton avion soit complet.
D'où ton message d'erreur : tu as prévu de faire appel à des fonctions externes, ok. Mais au moment de finaliser l'exécutable, ces fonctions restent introuvables.
Pourriez vous m'indiquer comment faire s'il vous plait ?
C'est désespérant...
− Soit tu utilises l'option « -c » avec GCC pour produire des fichiers objet « *.o », et tu les lies ensuite avec « ld », ou directement avec GCC ;
− Soit tu compiles directement tous les fichiers *.c en une fois :
$ gcc -o monprogramme joueur.c handler.c
Maintenant, attention : tu te sers des signaux pour faire quoi ? Une erreur très fréquente consiste à croire que les signaux UNIX (ceux émis par kill(), dont le nom devrait pourtant suffire à mettre la puce à l'oreille) servent à transmettre des données d'un processus à l'autre, ce qui n'est absolument pas le cas.
Voir ici, ici, ici et là.
Édit :
Mon arbitre dit au début : signal(SIGINT, handler) puis fait un kill(<fils>,SIGINT)
Si ton arbitre dit « signal(…) », ça veut dire qu'il définit la manière dont − lui − va gérer ces signaux si − lui − les reçoit. En aucune manière cela n'influera sur le fils qui fera comme ça lui chante, sauf s'il fait la même chose, bien sûr, ou si ce fils est créé avec un fork() depuis le processus arbitre et cela après que l'appel à signal() ait eu lieu.
Partager